JNI简介

转载http://www.cnblogs.com/eesijian/p/5843879.html

 1. JNI简介


  JNI是Java Native Interface的英文缩写,意为Java本地接口。

  问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。

  解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发。

2. JNI快速学习教程


2.1 问题:

  使用JNI写一段代码,实现string_Java_Test_helloworld(JNIEnv *env, jclass cls , jstring j_str)函数,实现在字符串j_str(“world”)前面加上hello,并返回。

2.2 解决问题过程:

  I. 编写Test.java类:

复制代码
 1 public class Test{
 2     // native interface
 3     public native String helloworld(String text);
 4     
 5     public static void main(String[] args){
 6         // Load dynamic library
 7         System.loadLibrary("Test2");
 8         Test ts = new Test();
 9         String text = ts.helloworld("world");
10         System.out.println(text);
11     }
12 }
复制代码

  备注:

    1、加载动态类库:System.loadLibrary(“Test2”);【Windows下加载的就是Test2.dll,Linux下加载的是Test2.so】

  II. 编译Test.java文件

    进入cmd输入命令 > javac Test.java

  III. 生成Test.h文件

    进入cmd输入命令 > javah Test

  Test.h文件内容如下:

复制代码
 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 /* Header for class Test */
 4 
 5 #ifndef _Included_Test
 6 #define _Included_Test
 7 #ifdef __cplusplus
 8 extern "C" {
 9 #endif
10 /*
11  * Class:     Test
12  * Method:    helloworld
13  * Signature: (Ljava/lang/String;)Ljava/lang/String;
14  */
15 JNIEXPORT jstring JNICALL Java_Test_helloworld
16   (JNIEnv *, jobject, jstring);
17 
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif
复制代码

  备注:

    1、函数声明,固定格式:JNIEXPORT;返回类型:jstring;JNI调用:JNICALL;Java_完整类名_方法名:Java_Test_helloworld;

    2、函数参数:调用jni.h封装好的函数指针:JNIEnv;Java类本身:jobject,Java文件传入参数:jstring。

  IV. 编写C语言文件Test2.c实现Test类调用动态链接库的功能:

复制代码
 1 #include "Test.h"
 2 #include <string.h>
 3 
 4 JNIEXPORT jstring JNICALL Java_Test_helloworld
 5   (JNIEnv *env, jobject obj, jstring string){
 6     const char* str = (*env)->GetStringUTFChars(env,string,0);
 7     char cap[128];
 8     cap[0] = 'h';
 9     cap[1] = 'e';
10     cap[2] = 'l';
11     cap[3] = 'l';
12     cap[4] = 'o';
13      
14     strcat(cap,str);
15       
16     (*env)->ReleaseStringUTFChars(env,string,0);
17     return (*env)->NewStringUTF(env,cap);
18   }
复制代码

  备注:

    1、由于Java本身使用了双字节字符,C语言本身都是单字节字符,所以需要使用(*env)->GetStringUTFChars()转换Java和C之间的字符串;

    2、GetStringUTFChars()和NewStringUTF(),第一个是从UTF8转换为C的编码格式,第二个是根据C的字符串返回一个UTF8字符串;

    3、ReleaseStringUTFChars()是用来释放对象的,在Java中有虚拟机进行垃圾回收,但是在C语言中这些对象必须手动回收,否则可能造成内存泄漏。

  V. 编译和运行

  编译:

    进入cmd输入命令 > gcc -I “D:\Program Files\Java\jdk1.8.0_45\include” -I “D:\Program Files\Java\jdk1.8.0_45\include\win32” –share Test2.c -o Test2.dll

  运行:

    进入cmd输入命令 > java Test

  运行结果如下:

    helloworld

3. 总结:


  第一步:编写带有native方法的Java类(Test.java),使用javac工具编译Java类(生成Test.class);

  第二步:使用javah生成与native方法对应的头文件(Test.h);

  第三步:使用C/C++实现相应的头文件(Test2.c),并编译为动态链接库(Test2.dll)。

  本文运行环境:Windows 64位操作系统,JDK 1.8版本,mingw64(GCC)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值