问题背景:使用NDK将c++源码编译成java可调用的jni接口(符合java ABI的.so动态库)后,调用c++实现的相应方法时报错,意思是未找到该方法。
原因:使用javah将对应的java类生成.h文件后,为了简化文件名我对.h文件进行了修改,修改后直接复制.h文件生成.cpp文件并在该cpp文件中实现对应方法。但我复制完后未将对javah生成的.h文件的重定义检查删除,导致实现的cpp方法无效(因为实现的不是更改后的.h方法,而是javah实现的.h方法)。
举个例子:
1.对JniUtils java类使用javah命令生成com_example_jnitest_ndk_JniUtils.h
2.为了简化文件名,我将javah生成的头文件名修改为JniUtils.h,并直接拷贝该文件修改后缀得到JniUtils.cpp
3.JniUtils.cpp文件内容如下,问题就出现在这一步。注意红框中的头文件重复定义检查,这里检查的是javah生成的头文件,所以这里的JNICALL Java_com_example_jnitest_1ndk_JniUtils_getStringFromCpp (JNIEnv *env,