Jni中的各个参数的作用

一、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,则代表类的实例对象
上一篇:39 C 语言与汇编语言混合编程


下一篇:深度阅读:详细剖析 extern "C"