JNI 学习笔记

简介:

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

2,开始第一个JNI

1,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文件

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

 

打开后你会看到


     
     
  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方法名称转换详解:

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

 

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

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)); 

输出结果

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

2,补充一下:

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

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

3,JNI映射的数据类型



本文转自 liam2199 博客,原文链接:  http://blog.51cto.com/youxilua/773024 如需转载请自行联系原作者
相关文章
|
6月前
|
存储 Java C++
[NDK/JNI系列02] JNI的设计原理与数据类型
[NDK/JNI系列02] JNI的设计原理与数据类型
46 0
[NDK/JNI系列02] JNI的设计原理与数据类型
|
6月前
|
Java API Android开发
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
68 0
|
6月前
|
缓存 Java API
[NDK/JNI系列05] JNI引用API
[NDK/JNI系列05] JNI引用API
53 0
|
Java 编译器 API
Android使用NDK(从java调用本地函数'JNI')
Android使用NDK(从java调用本地函数'JNI')
230 0
Android使用NDK(从java调用本地函数'JNI')
|
Java Unix Linux
JNI学习(0)——关于JNI
JNI学习(0)——关于JNI
139 0
JNI学习(0)——关于JNI
|
Java
JNI学习(3)——运行基于JNI的java程序
JNI学习(3)——运行基于JNI的java程序
96 0
JNI学习(3)——运行基于JNI的java程序
|
Java C++ Android开发
JNI开发极简教程
JNI(Java Native Interface) Java调用C/C++,C/C++调用Java的一套API 前言: 学习JNI需要C/C++的相关知识,而且需要研究JNI手册.
2454 0
|
Java Android开发 C++
Android NDK开发系列教程6:JNI函数注册(JNI_OnLoad)
在使用native方法前都会先加载该native方法的so文件,通常在一个类的静态代码块中进行加载,当然也可以在构造函数,或者调用前加载。jvm在加载so时都会先调用so中的JNI_OnLoad函数,如果你没有重写该方法,那么系统会给你自动生成一个。
7302 0