JNI能让Java代码在Java虚拟机里调用其他编程语言(例如C、C++)写的应用或库,且不会影响任何Java虚拟机的实现。

什么时候用JNI?

1、应用程序所需的平台相关功能,标准的Java类库不支持时。

2、已经有一个用其他语言写的库,想要复用时。

3、想使用一些低级别的语言(例如汇编)实现部分关键代码时。

JNI问题

1、对开发者的要求更高。

2、丧失可移植性。

例子(C语言,on Mac)

1、添加声明为native的方法。

package nativetest;

public class CaculatorInC {

    //加法
public static native int add(int a, int b);
}

2、编译成h文件

有包名,直接这样就可以编译成h文件。(不然会报找不到类文件)

javah nativetest.CaculatorInC

没包名,先编译成class

javac xxx.java
javah xxx

生成的h文件内容

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class nativetest_CaculatorInC */ #ifndef _Included_nativetest_CaculatorInC
#define _Included_nativetest_CaculatorInC
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: nativetest_CaculatorInC
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_nativetest_CaculatorInC_add
(JNIEnv *, jclass, jint, jint); #ifdef __cplusplus
}
#endif
#endif

3、编写自己c文件

可以查看生成后的h文件,实现里面的方法。

#include "jni.h"
#include "nativetest_CaculatorInC.h" //#include otherheaders JNIEXPORT jint JNICALL Java_nativetest_CaculatorInC_add
(JNIEnv *env, jclass object, jint a, jint b){
return a + b;
}

4、将c文件编译成动态链接库

gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1..0_45.jdk/Contents/Home/include/ *.c -o libcaculator.jnilib

注意可能会报,jni.h或jni_md.h文件不存在。

处理方法:

1、找到jdk的位置(/usr/libexec/java_home -V),编译命令带上“xxx/Contents/Home/include”的目录,如上。

2、把“xxx/Contents/Home/include/darwin”的目录里jni_md.h文件复制到include目录。

5、测试

package nativetest;

import nativetest.CaculatorInC;

public class Test {
static {
//System.setProperty("java.library.path", ".");
System.load("/Users/lufeng/Documents/project/java-workspace/java-demo/src/libcaculator.jnilib"); // 载入本地库
} public static void main(String[] args) {
System.out.println(CaculatorInC.add(1, 2));
}
}

参考文献

https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/intro.html#java_native_interface_overview

最新文章

  1. 从零开始编写自己的C#框架——框架学习补充说明
  2. Python笔记之不可不知
  3. iOS阶段学习第12天笔记(类的初始化)
  4. 全选,不选,反选 jquery
  5. Spark SQL External Data Sources JDBC官方实现写测试
  6. 第二回 认识CDN
  7. java读取XML文件的四种方式
  8. Java I/O---字符与字节转换流---FileReader&amp;FileWriter:
  9. Javascript - ExtJs - Ext.form.Panel组件
  10. vue的数据绑定和组件化
  11. Java使用点滴
  12. scrapy微信爬虫使用总结
  13. COM线程模型的行为
  14. C#自定义控件的创建
  15. selenium 基本常用操作
  16. 【bzoj2795】【Poi2012】A Horrible Poem
  17. usb端点(endpoint)知识详解
  18. Druid 配置_StatViewServlet配置
  19. 基于OpenCV之视频读取,处理和显示框架的搭建(一)
  20. 【Salvation】——人物角色动画实现

热门文章

  1. Ubuntu使用(二)——eclipse配置与问题
  2. AFNetworking封装-项目使用
  3. ListView的setOnItemClickListener位置错乱问题
  4. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】
  5. Laravel篇之Laravel的安装及使用
  6. GET和POST两种基本请求方法的区别(转)
  7. CSS基础知识思维导图xmind
  8. 亲测:LNMP环境下,解决项目缓冲慢、502以及配置https的问题
  9. 带你使用JS-SDK自定义微信分享效果
  10. es6 语法 (Generator)