android jni的坑
传统的jni方式是这个步骤
1.在java文件中定义native函数
2.使用javah 生成对应C函数定义并实现
3.编写Android.mk把C源码用ndk编译成动态库
4.在java中调入编译好的动态库
然而android下是不行的,android下的jni必须要有JNI_OnLoad函数
#define JNIREG_CLASS "com/hello/helloworld"//指定要注册的类
#define TAG "HELLOWORLD-JNI"
static JNINativeMethod gMethods[] = {
{ "hello_world", "([BJ[BJ)[B", (void*)Java_com_hello_hello_world },//绑定
};
static int registerNativeMethods(JNIEnv* env, const char* className,
* gMethods, int numMethods)
JNINativeMethod{
;
jclass clazz= (*env)->FindClass(env, className);
clazz if (clazz == NULL) {
(ANDROID_LOG_ERROR, TAG, "Native registration unable to find class '%s'\n", className);
__android_log_printreturn JNI_FALSE;
}
if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {
(ANDROID_LOG_ERROR, TAG, "RegisterNatives failed for '%s'\n", className);
__android_log_printreturn JNI_FALSE;
}
return JNI_TRUE;
}
static int registerNatives(JNIEnv* env)
{
if (!registerNativeMethods(env, JNIREG_CLASS, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])))
return JNI_FALSE;
(ANDROID_LOG_INFO, TAG, "Load success!");
__android_log_printreturn JNI_TRUE;
}
(JavaVM* vm, void* reserved)
JNIEXPORT jint JNICALL JNI_OnLoad{
* env = NULL;
JNIEnv= -1;
jint result
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
(ANDROID_LOG_ERROR, TAG, "GetEnv failed!");
__android_log_printreturn -1;
}
if(env == NULL){
(ANDROID_LOG_ERROR, TAG, "GetEnv failed!");
__android_log_printreturn -1;
}
(ANDROID_LOG_INFO, TAG, "Loading . . .");
__android_log_print
if (!registerNatives(env)) {//注册
return -1;
}
/* success -- return valid version number */
= JNI_VERSION_1_4;
result
return result;
}
关于JNINativeMethod的说明,这篇文章写的很清楚
[Android JNI 使用的数据结构JNINativeMethod详解]http://blog.csdn.net/bigapple88/article/details/6756204
参考文章:
Android JNI(实现自己的JNI_OnLoad函数)
Android的NDK开发(1)————Android JNI简介与调用流程
可能会遇到的陷阱(其中的内存释放问题我就遇到了):