问题:
由于之前编译的NDK 文件全部是.cpp 结尾,所以未曾出现c引用c++的函数的问题,最近由于要搞播放器,没办法很多之前的播放器都是c写的。
分析:
<1> NDK中默认的编译器应为gcc,如果是g++相信不存在.c 文件引用c++的一些特性出错的问题,比如#include <string>
因为g++ 把.c .cpp 结尾文件全部当做c++来编译,所以之后的所以就是没问题。
<2>鉴于是gcc,对于.c的文件会按照c来编译,所以#include <string > ,class ,namespace 都不被识别,因为c里根本没有这个;
而对于cpp文件,gcc会按照c++ 来编译,所以c++的特性都可以使用。
<3>所以之后的所以,如果在.cpp文件中定义 jni的函数,需要加上 extern "C" ,如
extern "C"
JNIEXPORT jint JNICALL Java_com_xxxxx_yyyyy_Native_start(JNIEnv *env, jclass class)
因.cpp 编译时会定义__cplusplus 宏,所以可更改为如下
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_com_xxxxx_yyyyy_Native_start(JNIEnv *env, jclass class)
#ifdef __cplusplus
}
#endif
而对于.c文件这些就不需要了。
<4> 回归主题,如果需要c 调用c++ 函数,首先c++的头文件中不能包含c所没有的特性,其次所有提供的函数需要加上 extern "c"
如不正确,欢迎各位方家指正!!!!