на основе кода, найденного в forum post:
- вам нужно добавить заголовок в папку
Classes/
, где вы просто иметь функцию CPP объявлен, но не определен.
- вам необходимо добавить определение функции в
proj.android/jni
в файл .cpp
. Я использовал proj.android/jni/hellocpp/main.cpp
, который, по моему мнению, является стандартным для проекта staros cocos2dxv3. В этом методе вы вызываете метод, который вы определили в java, в этом случае он был определен как статический метод для вашей Activity. Значение по умолчанию было названо `AppActivity.
- убедитесь, что у вас есть разрешение вибрации на вашем
proj.android/AndroidManifest.xml
, <uses-permission android:name="android.permission.VIBRATE"/>
Так, в одном из своих стандартных заголовков C++ в папке Classes/
, добавьте
//Classes/any_header.h
void vibrate(int milliseconds);
и связанный с ним .cpp
файл, назовите его:
//Classes/any_header.cpp
void get_hit()
{
vibrate(200);
}
В вашем proj.android/AndroidManifest.xml
, y ou'll хотите добавить эту строку
<manifest>
...
<uses-permission android:name="android.permission.VIBRATE"/>
</manifest>
В CPP файле jni
будет иметь дело с, скажем proj.android/jni/hellocpp/main.cpp
, вам необходимо определить связь между Java и C++ с помощью вызова метода Java:
//proj.android/jni/hellocpp/main.cpp
/* this function should already exist though */
void cocos_android_app_init (JNIEnv* env, jobject thiz) {
LOGD("cocos_android_app_init");
AppDelegate *pAppDelegate = new AppDelegate();
}
/* this is the new one you're adding, where org/cocos2dx/cpp/AppActivity
is the java file where your Activity with the vibrate static method is defined
*/
void vibrate(int milliseconds)
{
JniMethodInfo minfo;
CCAssert(JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity", "vibrate", "(I)V"), "Function doesn't exist");
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, (jint)milliseconds);
minfo.env->DeleteLocalRef(minfo.classID);
}
, наконец, вот файл .java
, где вызывается андроид, вызывающий вибрацию. Шахта была proj.android/src/org/cocos2dx/cpp/AppActivity.java
/* default imports */
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
/* imports needed for vibration stuff */
import android.os.Vibrator;
import android.content.Context;
import android.app.ActivityManager;
import android.util.Log;
import android.os.Bundle;
public class AppActivity extends Cocos2dxActivity {
private static volatile Cocos2dxActivity mainActivity;
public static void setMainActivity(Cocos2dxActivity activity)
{
mainActivity = activity;
}
public static Cocos2dxActivity getMainActivity()
{
if(mainActivity == null)
{
Log.w("MY_APP_NAME_GOES_HERE", "Warning : null main Activity");
}
return mainActivity;
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
AppActivity.setMainActivity(this);
}
public static void vibrate(int milliseconds)
{
Vibrator v = (Vibrator) getMainActivity().getSystemService(Context.VIBRATOR_SERVICE);
if (getMainActivity().getSystemService(Context.VIBRATOR_SERVICE) != null)
{
v.vibrate(milliseconds);
}
}
}
он работает на всех устройствах для Android, за исключением вкладки Like> nexus 7 ... –
becuase Tab не имеет вибратора. –