-
公司项目要引入C/C++的DLL。只为能看懂一些代码。研究了一下JNI。下面是我研究JNI的笔记。
-
Java中简单调用C++例子
-
首先在Java类中声明一个Native的方法
-
使用Javah命令生成包含Native方法声明的C/C++头文件,一般在.class文件路径下(不带文件的包名)在cmd中使用
-
按照生产的C/C++头文件来写C/C++源文件
-
将C/C++源文件编译成动态链接库(.dll)
-
将DLL文件加入PATH环境下
-
在Java中调用DLL文件
-
-
Java中Javah和Javap的使用
-
Javah的使用
使用Javah命令生成包含Native方法声明的C/C++头文件,一般在.class文件路径下(不带文件的包名)在cmd中使用
-
Javap的使用
在CMD进去到Class的路径下面
使用Javap命令
-
-
Java的类型在C/C++的映射关系
4、JNI获取Java的类。(JNIEnv类中提供了如下的几个简单的函数获取到jclass)
-
jclass FindClass(const char*claName)
FindClass会在系统的环境变量下去寻找类,传入完成的包名+类名,
注意:
包与包之间是用/而不是用.
例如:
jclass clazz =env->FindClass(“com.lyh.jni.TestNative”);
-
jclass GetObjectClass(jobjectobj)
-
jclass GetSuperClass(jclassclazz)
-
-
获取/设置Java中的属性
-
获取Java中的属性值
GetFileId(jclass clazz,const char* name,const char* sign);获取非静态属性
GetStaticFileId(jclass clazz,const char* name,const char* sign);获取静态属性
注意:
GetMethodId也可以获取到构造函数
-
env->GetMethodId(date_Clazz,”<init>”,”()V”);
-
设置Java中的属性值
可以使用Set<Type>Filed,设值属性值。
注意:怎么获取数组的属性
使用GetObjectField
-
-
调用Java中的方法
-
调用Java中的方法
-
调用Java中,父类的方法(子类集成父类并且重写父类的方法)
-
调用Java中的构造函数
GetMethodId也可以获取到构造函数
env->GetMethodId(date_Clazz,”<init>”,”()V”);
-
-
Java对象的创建
-
使用NewObject创建对象
-
使用AllocObject创建对象
-