一、jni demo
#include <jni.h>
#include <string>
using namespace std;
extern "C" JNIEXPORT jstring JNICALL
Java_com_qxc_testnativec_MainActivity_stringFromJNI(JNIEnv* env, jobject) {
string str = "Hello from C++";
return env->NewStringUTF(str.c_str());
}
这是一个jni的函数,接下来我们解析一下各个参数。
二、extern “C”
1、先看一下去掉和不去掉的区别
//保留extern "C"
000000000000ea98 T
Java_com_qxc_testnativec_MainActivity_stringFromJNI
//去掉extern "C"
000000000000eab8 T
_Z40Java_com_qxc_testnativec_MainActivity_stringFromJNIP7_JNIEnvP8_jobject
2、c和c++编译的区别:
- 在C++中,存在函数的重载问题,函数的识别方式是通过:函数名,函数的返回类型,函数参数列
- C不支持函数的重载,编译之后函数名不变
所以,如果希望编译后的函数名不变,应通知编译器使用C的编译方式编译该函数(即:加上关键字:extern “C”)。
三、JNIEXPORT、JNICALL
JNIEXPORT 用来表示该函数是否可导出(即:方法的可见性)
JNICALL 用来表示函数的调用规范(如:__stdcall)
四、JNIEnv
JNIEnv 代表了Java环境,通过JNIEnv*就可以对Java端的代码进行操作,如:
- 创建Java对象
- 调用Java对象的方法
- 获取Java对象的属性等
五、jobject
jobject 代表了定义native函数的Java类 或 Java类的实例:
- 如果native函数是static,则代表类Class对象
- 如果native函数非static,则代表类的实例对象