且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JNI 学习笔记

更新时间:2022-08-29 20:19:18

1,先把c语言的编译环境搭建好,windows下这里使用mingw

JNI 学习笔记

2,开始第一个JNI

1,JNI的原理图

JNI 学习笔记

直接到官方教程那里截的….

2,开始使用JNI


  1. package kg.tom;   
  2. public class MyJni {      
  3. //使用JNI的关键字native      
  4. //这个关键字决定我们那些方法能在我们的C文件中使用      
  5. //只须声明,不必实现       
  6. public native void display();       
  7. public native double sum(double x,double y);            
  8. //这个是到时候调用我们写好的C文件      
  9. //现在用不上       
  10. //static {      
  11. //  System.loadLibrary("sum");      
  12. //}                
  13. public static void main(String[] args) {          
  14. //到时候测试用方法现在用不上          
  15. //new MyJni().display();          
  16. //System.out.println(new MyJni().sum(2.0, 3.0));      
  17. }} 

然后,就是返回到我们的java基础了…将我们写好的类,转换成头文件

1,先把写好的类转换成.class文件

JNI 学习笔记

2,把.class文件转换成头文件,成功的话就会在src目录下看到.h文件了

JNI 学习笔记 

打开后你会看到


  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class kg_tom_MyJni */   
  4. #ifndef _Included_kg_tom_MyJni  
  5. #define _Included_kg_tom_MyJni  
  6. #ifdef __cplusplus  
  7. extern "C" {  
  8. #endif  
  9. /*   
  10. * Class:     kg_tom_MyJni   
  11. * Method:    display   
  12. * Signature: ()V   
  13. */  
  14. JNIEXPORT void JNICALL Java_kg_tom_MyJni_display  
  15.   (JNIEnv *, jobject);   
  16. /*   
  17. * Class:     kg_tom_MyJni   
  18. * Method:    sum   
  19. * Signature: (DD)D   
  20. */  
  21. JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum  
  22.   (JNIEnv *, jobject, jdouble, jdouble);   
  23. #ifdef __cplusplus}  
  24. #endif  
  25. #endif 

native方法名称转换详解:

JNI 学习笔记

3,就是写我们的C文件了


  1. //必须的头文件jni.h  
  2. #include <jni.h>  
  3. //导入我们需要实现的本地方法#include "kg_tom_MyJni.h" 
  4. #include <stdio.h>   
  5. JNIEXPORT void JNICALL Java_kg_tom_MyJni_display    
  6. (JNIEnv *env, jobject obj){      
  7. printf("Hello World tom!!");      
  8. return;}   
  9. JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum  
  10.   (JNIEnv *env, jobject obj, jdouble a, jdouble b){   
  11.    return a + b;} 

4,windows下编译成dll文件,linux下编译成so文件.这里只说windows下的

1,java基础

找到我们的jdk文件夹,然后打开其中的include文件夹,就会看到一些头文件,看下关键的Jni.h头文件在不在,在的话,继续,不在

自行下载一个新的jdk…

2,把C文件编译成dll文件

我们这里使用mingw….你会用VC6也可以用VC6编译…

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o sum.dll java_sum_native.c

JNI 学习笔记 

JNI 学习笔记

没出什么提示的话就是成功的了…

4,运行我们的JNI

1,用eclipse的话,我们把编译好的dll放到项目根目录,注意不是代码根目录


  1. //把刚才注释的地方删掉..  
  2. //这就是必须的,用来读取我们写好的C语言编译好的dll,后缀是系统自己辨认…千万不要自己写  
  3. static {          
  4. System.loadLibrary("sum");      
  5. }  
  6. //mian方法中  
  7. //用底层c代码实现输出..呵呵~~  
  8. new MyJni().display();  
  9. //用c计算会不会快点呢..呵呵~  
  10. System.out.println(new MyJni().sum(2.0, 3.0)); 

输出结果

JNI 学习笔记

貌似java本身的输出,优先级比较高??

2,补充一下:

1,我们要运行我们编译的C文件,是与我们创建的类是必须一起存在,

例如:我把MyJni.java删掉,然后另起一个Hello.java能不能直接调用dll中的方法呢?那是肯定不行的..因为,jni需要类名来进行查找

3,JNI映射的数据类型



本文转自 liam2199 博客,原文链接:  http://blog.51cto.com/youxilua/773024 如需转载请自行联系原作者