JNI调用C和C++存在的区别
- JNI是由C语言定义接口的,JNI通过函数名找函数入口,执行函数里的内容。这和函数用什么语言生成的并没有关系。只要保证函数名称符合JNI的协议。而使用C++要注意的是C++默认生成的函数名称和你写在源文件中的名称并不相同,因为C++要处理函数重载,会在函数名称中加上参数信息,这称为name mangling。解决方法是定义函数时在前面加上extern "C"修饰,告诉编译器这函数要被C调用(当然,其实是JNI)。本质没有什么区别,一个是JNI调C,一个是JNI调C,C再掉C++,这样理解就简单了~
- 在C的定义中,env是一个两级指针,而在C++的定义中,env是个一级指针。C形式需要对env指针进行双重deferencing,而且须将env作为第一个参数传给jni函数,举个简单的例子:
eg:
- 对于XXX.c:JNI 函数调用由“(*env)->”作前缀,目的是为了取出函数指针所引用的值。
return (*env)->NewStringUTF(env,"HelloJNI!");
- 对于XXX.cpp:JNIEnv 类拥有处理函数指针查找的内联成员函数。
return env->NewStringUTF("HelloJNI!");
- 可以发现,C或者C++的实现很类似,但是它们对env的操作方式有所不同,因此使用C和C++来实现同一个JNI方法,它们的区别主要集中在对env的操作上,其他都是类似的