以前尝试Android中调用C/C++代码,都是自己写一个带native方法的类,然后自己通过命令生成一个头文件,然后再用一个C/C++文件include这个头文件。就一直都很疑惑为毛现在Android Studio点了include c++之后没有生成头文件的操作。最近动手尝试了一波,把原来项目里的native-lib.cpp删掉,将CMake.txt中的native-lib.cpp全部换成了自己的hello.cpp。最后运行的时候却报错了,很奇怪,为毛呢?自己生成了一个头文件放到cpp目录底下,又不报错了……
当时真是感觉日了狗了,为毛他不需要头文件,偏偏我要?后来网上搜了一下,看到这么一句话:
在Java中调用JNI接口时,出现异常,察看日志,发现有如下错误:
WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V
检查了几遍代码,Cpp中确实定义了这个接口,而且仔细对照了Java的包名、类名,确实没有错误,那为什么会出现这种问题呢。后来突然想到,JNI接口 都是以C的方式定义的,现在使用C++实现,函数定义前是否需要加上extern "C"呢?
看完就感觉不对头了,果然我自己的cpp中没有extern "C"这句话,而生成的头文件都是有的。我重新建了一个include c++的项目,比对了一下,果然也是有这句话的。于是加了这句话,可以不生成头文件了。