Java Native Interface(JNI)
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));
}
}
参考文献
Java Native Interface(JNI)的更多相关文章
- 【详解】JNI (Java Native Interface) (二)
案例二:传递参数给C代码,并从其获取结果 注:这里传递的参数是基本类型的参数,在C代码中有直接的映射类型. 此案例所有生成的所有文件如下: (1)编写案例二的Java代码,如下: 这里我们定义了一个n ...
- 【详解】JNI (Java Native Interface) (四)
案例四:回调实例方法与静态方法 描述:此案例将通过Java调用的C语言代码回调Java方法. 要想调用实例对象的方法,需要进行以下步骤: 1. 通过对象实例,获取到对象类的引用 => GetO ...
- 【详解】JNI (Java Native Interface) (三)
案例三:C代码访问Java对象的实例变量 获取对象的实例变量的步骤: 1. 通过GetObjectClass()方法获得此对象的类引用 2. 通过类引用的GetFieldID()方法获得实例变量的 ...
- Java Native Interface Specification(JNI)
Java Native Interface Specification(JNI) 使用场景: 需要的功能,标准的java不能提供 有了一个用其他的语言写好的工具包,希望用java去访问它 当需要高性能 ...
- Java Native Interface 六JNI中的异常
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...
- Java Native Interface 五 JNI里的多线程与JNI方法的注册
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...
- Java Native Interface 四--JNI中引用类型
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...
- Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...
- Java Native Interface 基于JNI的嵌入式手机软件开发实例
1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...
随机推荐
- 第一册:lesson eighty nine.
原文: For sale. A:Good afternoon. I believe that the house is for sale. B:That's right. A:May I have a ...
- C# 获取当前屏幕的宽高和位置
上一篇博客<C# 获取当前屏幕DPI>,介绍了如何获取当前屏幕的DPI设置 本章主要介绍如何获取当前窗口所在屏幕的信息 当前屏幕信息 如果当前是单屏幕,可以直接获取主屏幕 var prim ...
- H5 贪吃蛇源码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Git合并指定文件到另一个分支
经常被问到如何从一个分支合并特定的文件到另一个分支.其实,只合并你需要的那些commits,不需要的commits就不合并进去了. 合并某个分支上的单个commit 首先,用git log或sourc ...
- 45.work_struct和delayed_work的工作队列使用
介绍 在中断处理中,经常用到工作队列,这样便能缩短中断处理时的时间 中断中通过调用schedule_work(work)来通知内核线程,然后中断结束后,再去继续执行work对应的func函数 示例 当 ...
- 34.QT-制作串口助手(并动态检测在线串口,附带源码)
qextserialport-1.2rc库下载链接: http://www.pudn.com/Download/item/id/2298532.html 1.添加源码到工程 将qextserialpo ...
- QueryRunner使用之可变条件的处理
在三层架构的Dao层中,需要通过不确定的条件,从数据库查询结果. 可以利用List集合作为容器将条件存储起来. 实际开发中的代码: public List<Hotel> searchByF ...
- laravel5.1 ajax post传值_token
laravel框架中只要是涉及到post传值都需要传 _token ,这是框架中为了防止crsf攻击所做的安全措施,那么我们用到ajax中的post 方式传值时,也需要在所传数据中添加一个_token ...
- vue从入门到进阶:Class 与 Style 绑定(四)
绑定 HTML Class 对象语法 ①.添加单个class: <div v-bind:class="{ active: isActive }"></div> ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
题意 题目链接 Sol 打出暴力不难发现时间复杂度的瓶颈在于求\(\sum_{i = 1}^n i^k\) 老祖宗告诉我们,这东西是个\(k\)次多项式,插一插就行了 上面的是\(O(Tk^2)\)的 ...