Android Studio 编写 JNI 代码时的一个小问题

6/12/2019 posted in  Android comments
'AttachCurrentThread' in '_JavaVM'; did you mean 'attachCurrentThread'?
auto result = JVM.load()->AttachCurrentThread(&env, nullptr);
^~~~~~~~~~~~~~~~~~~
attachCurrentThread
/opt/android-sdk/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/jni.h:1058:10: note: 'attachCurrentThread' declared here
jint attachCurrentThread(JNIEnv** p_env, void* thr_args)

最近一直在弄 C++/JNI 这一块的东西,好巧不巧,碰到了一个很奇怪的编译问题,AttachCurrentThread 这个方法居然找不到了。这个方法是定义在 jni.h 中的,不可能签名变了,也不可能方法丢失的。出现这个问题的原因其实很好玩。

我在 coding 和 debug 的时候,因为查看到了 jni.h 这一层的文件, Android Studio 很强大,直接通过文件的路径,跳转到了这个文件上,并且打开了这个文件供查看。而我在查看这个文件的时候,不小心把这个 AttachCurrentThread 给改成了 attachCurrentThread,而这个文件又不是只读的,所以这个文件就被写入成功了,又因为这个文件并不在我的版本控制中,所以看不到修改记录,每次编译的时候都会引用到这个文件,所以每次都会失败。

退回修改以后一切正常。