首页 > 代码库 > JNI基础学习

JNI基础学习

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 __cplusplusextern "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回收过程中可能出现安全问题

 

JNI基础学习