jni java C/C++ 相互调用

时间:2024-01-07 10:00:50

韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha

java 中  声明 一个 native 方法

用javah命令 生成 包含 native方法定义的  c++头文件

在 项目目录 下 打开命令行输入 javah hmfs.TestNative  就生成了对应的 头文件

创建c++工程,把刚才的头文件 复制过来。

创建c++文件, 编写相关代码。 注意 包含的头文件。 编译之后,会生成一个 dll 文件。

将dll文件路径  可以添加到 windows的 path环境变量中

然后java代码中

System.loadLibrary(“nativeCode”); //这个就是dll文件的名字

TestNative  mTestNative  = new TestNative ();

mTestNative.printText();

这样就成功调用了c++代码

=====

在我们创建的C++文件中,遵循了jni的一些规则。

JNIEnv 意思是  java环境。

通过 JNIEnv* 这个指针 就可以 调用java代码,创建对象,调用方法,获取属性。

JNIEnv 这个类中 有很多方法,比如 创建对象,创建字符串,创建数组,获得或设置字段,调用方法,查找类,获得对象类,获得父类 等。

jobject

jni  java C/C++  相互调用

jclass 表示 java中的 Class类。

JNIEnv中 有几个方法 与jclass相关。 查找类,获得对象类,获得父类。

FIndClass 会在 classpath环境变量下 寻找类。 传入完整类名。如:

jclass cls_string = env->FindClass("java/lang/String");

jni.h这个头文件中 定义了 jfieldID,jmethodID 代表 java端的字段和方法。

JNIEnv中 有 相关方法如:获得字段ID,获得方法ID。

如 env->GetMethodID(data_Clazz,"<int>","()V")

第一参数 是 jclass , 表明在哪个类中

第二个 是 表名 属性或者方法的 名称

第三个  是 指定 取得的属性 或者 方法参数的类型。

(I)V  是 int  类型。 (D) 是 double类型。

jni  java C/C++  相互调用

jni  java C/C++  相互调用

jni  java C/C++  相互调用

可以用 javap 命令来查看 java代码 对应的  签名 从而得到第三个参数。

jni  java C/C++  相互调用

获得 修改 java中的 字段。

c++调用 java中的方法

jni  java C/C++  相互调用

c++创建java 类对象

jni  java C/C++  相互调用

jni  java C/C++  相互调用

c++ 获得java中的 字符串,并修改。

jni  java C/C++  相互调用