继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

JNI技术-入门教程

紫衣仙女
关注TA
已关注
手记 366
粉丝 71
获赞 334

前言:

为什么用JNI技术,jni技术是连接Java和C/C++的桥梁,最近在封装新的SDK,后端技术是用C++写的,想要调用C++的接口,Java本身是调不到的,所以想要调用C的接口就需要一个桥梁,这时候我们就用到了JNI技术。


JNI是什么?:

1、首先我们要明白JNI是什么,JNI(Java native Interface  -Java本地接口)也就是Java与C/C++连接的桥梁;

2、native关键字:使用native所修饰的方法为本地方法,该方法只有声明,没有实现,表示该实现是由C/C++来提供的。

  1. public native void output();  

3、jni本质上就是Java代码来调用动态链接库的过程(在Windows上,动态链接库就是一个.dll文件,在Linux上动态链接库就是一个.so文件,如果是在Linux上调用动态链接库必须以lib开始)

我们要使用的动态链接库叫什么名字必须要提供出来,通常都是使用一个静态代码块来提供的


  1. static{  

  2.     System.LoadLibrary("HelloWorld");//一定不要加后缀名  

  3. }  


工作流程:



下面代码:

这是我写的一个Java代码,目的生成jni的头文件 .h文件


  1. package com.butel.jni;  

  2.   

  3. public class Test{  

  4.       

  5.     static{  

  6.           

  7.         System.loadLibrary("HelloWorld");  

  8.           

  9.     }  

  10.       

  11.     public native void output();  

  12.       

  13.     public static void main(String[] ages){  

  14.           

  15.         Test test = new Test();  

  16.         test.output();  

  17.           

  18.     }  

  19.       

  20. }   


  1. package com.butel.jni;  

可以看到我这里是有包名的,所以在生成头文件.h文件时,需要在想要的包下。下面是我用cmd执行放入相应的文件夹下

可以看到我这里生成了相应的包名,将Test生成了.class文件


生成.h文件

生成.h文件。我们用jdk里的Javah 去生成,我的jdk是1.8的

先说下在操作时遇到的问题 ,一般情况下,用Javah是可以生成的,也有可能出现下面这样的错误,


解决这样的问题当时我也是折腾了好长时间,就是不能生成.h文件,不过还是被我找到了生成.h的命令

输入一下命令就好了

最终会生成这样的一个.h文件

注意这里生成.h文件后,包名 com.butel.jni 将变为 com_butel_jni 将所有的点都转为了下划线

好了,到这里我们的.h文件就生成了。

  1.   

[cpp] view plain copy

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  

  2. #include <jni.h>  

  3. /* Header for class com_butel_jni_Test */  

  4.   

  5. #ifndef _Included_com_butel_jni_Test  

  6. #define _Included_com_butel_jni_Test  

  7. #ifdef __cplusplus  

  8. extern "C" {  

  9. #endif  

  10. /* 

  11.  * Class:     com_butel_jni_Test 

  12.  * Method:    output 

  13.  * Signature: ()V 

  14.  */  

  15. JNIEXPORT void JNICALL Java_com_butel_jni_Test_output  

  16.   (JNIEnv *, jobject);  

  17.   

  18. #ifdef __cplusplus  

  19. }  

  20. #endif  

  21. #endif  

原文出处

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP