Android Studio开发NDK用C++的坑

开发带有NDK(不是纯原生)的项目的时候,IDE会关联javah插件,自动生成native方法定义的头文件,头文件命名为完整包路径以下划线连接,文件内容格式如下(摘自某博友):
 
  

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_example_yourjavaclassname */

#ifndef _Included_com_example_yourjavaclassname
#define _Included_com_example_yourjavaclassname
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_yourjavaclassname
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_yourjavaclassname_getString
(JNIEnv *, jclass);

/*
* Class: com_example_yourjavaclassname
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_yourjavaclassname_plus
(JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif



然后再自定义任意名字的c文件,包含头文件和jni.h,并实现头文件定义的方法。
经本人测试,如果用C开发本地方法,这个流程没有问题。但是如果要用C++开发本地方法,单纯把c文件后缀改为cpp,打包编译正常,但是运行永远会报cannot find implementation of your native method.为什么?内部原理我无法十分清楚,但是看样子,链接执行的时候,JNI根据头文件的方法定义,应该是默认到c文件找实现,当只有cpp文件而没有c文件的时候就找不到实现方法了。但是so文件应该是没有问题的,因为编译是按照Android.mk定义的 LOCAL_SRC_FILES寻找打包源文件的。IDE的编译链接部分对程序员透明,这里我也不清楚,如果有哪位读者了解,还希望不吝赐教。

如果用C++开发本地方法,删掉IDE自动生成的头文件,直接用cpp文件实现所有本地方法,在代码外围加上如下的部分:
 
   

#ifdef __cplusplus
extern "C" {
#endif

......

#ifdef __cplusplus
}
#endif
这样就正常了!!!!

你可能感兴趣的:(C++,Android)