最近为了游戏开发,必须满足包小功能多,效果还得漂亮,翻遍了引擎列表,还是遇到一堆问题,要么就是最后打出来的包太大,例如unity, project anarchy(这一个vc2010express都打不开……何况还必须在windows下开发),要么就是opengl绘制有问题,例如(gameplay, irrlicht前几年的port),算了,还是记录一下jni的写法之一吧:
jni有一个方法叫做JNI_onLoad(JNIEnv *env, jobject reserved),这个玩意可以动态注册函数,所以无须再写啥 JNIEXPORT void XXXX之类的,记录如下:
static const JNINativeMethod methods_table[] = {
{"c", "(Ljava/lang/String;)V", (void*)onCreate},
{"p", "()V", (void*)onPause},
{"r", "()V", (void*)onResume},
{"d", "()V", (void*)onDestroy},
{"a", "(Ljava/lang/String;)V", (void*)adaptDataDir},
{"df", "()V", (void*)onDrawFrame},
{"sc", "(II)V", (void*)onSurfaceChanged},
{"sc", "()V", (void*)onSurfaceCreated},
{"t", "(IFF)V", (void*)onTouchEvent},
};
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return result;
}
env->RegisterNatives(env->FindClass("com.test.app.App"), methods_table, NELEM(methods_table));
return JNI_VERSION_1_4;
}
这样最好了,在com.test.app.App类中写上:
public static native void c(String s);
public static native void p();
public static native void r();
public static native void d();
public static native void sc();
public static native void sc(int w, int h);
public static native void t(int a, float x, float y);
public static native void a(String p);
public static native void df();
直接对应上了,当然,在初始化的时候不要忘记了System.loadLibrary("mylib")