JAVA JNI

 

JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

设计目的

标准的java类库可能不支持你的程序所需的特性。 JNI

或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。

你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能

 

JNI步骤:

 

1、   编写JAVA程序

Public class JniTest{

        native int add(int a , int b);

        //所有native关键词修饰的都是对本地的声明

        Static {

           System.loadLibrary(“add”);

           //加载动态库(libadd.so)

}

public static void main(String [] args){

      System.out.println(“start java app”);

      JniTest jniTest = new JniTest();

      int ret;

      ret = jniTest.add(4,6);

      System.out.println(“jni test result is: ” + ret);

 

}

}

 

2、   编译JAVA程序

javac JniTest.java

javah  -jni JniTest会生成JniTest.h如下

把JniTest.h改成add.c(mv JniTest.h  add.c)并把文件必修如下

2.1JNI函数命名规则

   Java(固定)_<包名,如com_android_xxx>_<类名>_<函数名>

   Java_JniTest_add

   固定 类名  函数名 (例中没有对JAVA进行打包)

3、   编译动态库

gcc –fPIC –c add.c –o add.o

在编译过程中会出现jni.h等文件找不到,所以用绝对路径指定头文件:在add.c修改如下

在jni.h修改如下

 

gcc –shared  add.o  –o libadd.so

//生成libadd.so动态库

4、   执行JAVA程序

LD_LIBRAY_PATH=.  java JniTest

//为程序增加从当前目录加载动态库

执行结果:

start java app

jni test result is: 10

 

 

总结:在过程中注意所包含的头文件是哪里的,jni.h是java(编译器)提供的,所以在<JAVA_HOME>/include/;通常我们写的linux程序的头文件是在/usr/include/下(gcc提供)

OK,完毕!!!!!!!!!!!!

 

最新文章

  1. servlet中service() 和doGet() 、doPost() 学习笔记
  2. ajax实现jsonp跨域接口
  3. ACM 交换输出
  4. SQl server master
  5. paper 88:人脸检测和识别的Web服务API
  6. ruby学习网站
  7. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
  8. Codeforces Round #261 (Div. 2) E. Pashmak and Graph DP
  9. javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式
  10. HTML URL编码参考(转载)
  11. 跟我一起学opencv 第三课之图像在opencv中的表示-Mat对象
  12. [人工智能] 安装python jupyter
  13. 【linux】之查看物理CPU个数、核数、逻辑CPU个数
  14. docker-ce-17.09 仓库的创建与使用
  15. (二进制 异或)Team Formation --ZOJ --3870
  16. RAID系列技术详解
  17. 博客迁移至新平台ixirong.com
  18. TCP Server有两个套接字
  19. modelform 对象和model之间的关系
  20. Tensorflow实践

热门文章

  1. window系统查看端口被哪个进程占用
  2. ulimit -c unlimited
  3. spring 4 泛型注入
  4. 【转】ubuntu下安装及设置FTP服务器!!
  5. UI设计(流程/界面)设计规范
  6. Javascript构造函数学习
  7. VS 项目(c#)引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
  8. Bom和Dom编程以及js中prototype的详解
  9. Number of Parallelograms(求平行四边形个数)
  10. pat 1049 Counting Ones