1.JNI(Java Native Interface):
它允许Java代码和其他语言写的代码进行交互,JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。下图是java与c的交互表现:
2.JNI的编写与编译流程:
1)编写java文件,声名Native方法
2)javac编译java文件
3)javah -jni 编译生成Native方法的头文件
4)用c/c++实现Native方法
5)编译Native方法
6)在JVM运行java程序
3.JNI数据类型:
4.简单的例子:
1)vim TestJni.java
public class TestJni{ public native void print(String str); static{ System.loadLibrary("MyJni"); } public static void main(String[] args){ new TestJni().print("Hello jni"); } }
2)javac TestJni.java
3)javah -jni MyJni 执行完后会生成MyJni.h文件
4)vim TestJni.c
#include <MyJni.h> #include<stdio.h> /* Header for class TestJni */ #ifndef _Included_TestJni #define _Included_TestJni #ifdef __cplusplus extern "C" { #endif /* * Class: TestJni * Method: print * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_TestJni_print (JNIEnv *env, jobject obj, jstring str){ jchar *s=(jchar *)(*env)->GetStringUTFChars(env,str,NULL); printf("content is %s\n",char *s); ReleaseStringUTFChars(env,str,(const char*)s); } #ifdef __cplusplus } #endif #endif
5)gcc -fPIC -shared -o libMyJni.so MyJni.c -I. -I/usr/local/jdk1.8.0_25/include/ -I/usr/local/jdk1.8.0_25/include/linux
6) java TestJni
如果出现没有找到lib可以用如下方法解决:
-Djava.library.path=. TestJni 或
export LD_LIBRARY_PATH=.
5.java对c传递的内容:
1)JNIEnv:传递JNI运行的环境变量,该指针是运行在JVM当前的一个进程的句柄
2)Jobject:Native的对象
6.JNI存在一些问题:
1)可移植性较差
2)数据映射存在一些问题
3)不安全,在java回收过程中可能出现安全问题
时间: 2024-10-12 16:48:43