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 ...
随机推荐
- CloudFoundry 之 IBMCloud 项目部署.NETcore例子
步骤一 通过官网注册IBMCloud账号 https://idaas.iam.ibm.com/idaas/mtfim/sps/authsvc?PolicyId=urn:ibm:security:aut ...
- 微信小程序实现支付功能
小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...
- python面向对象学习(三)私有属性和私有方法
目录 1. 应用场景和定义方式 2. 伪私有属性和私有方法 在java或者其他的编程语言中,使用访问修饰符来限制属性和方法的访问级别,一般有public.protected.default.priva ...
- 【转】为什么要使用ModelDriven
---恢复内容开始--- package cn.com.leadfar.struts2.actions; public class User { private int id ; private St ...
- K8S 基本操作
上一篇文章中,我们一创建了一个简单的 K8S 集群,https://www.cnblogs.com/klvchen/p/9553499.html 这里我们开始使用 kubectl 命令来创建应用,下面 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- ViewPager结合Fragment进行无限滑动
实现ViewPager结合Fragment实现无限循环切换,这里也是在适配器里面进行的,当然使用滑动监听也能够实现 import android.support.v4.app.Fragment; im ...
- ReactNative调研结果
React Native相关调研总结 一.概要 React Native - 使用React开发世界一流的原生应用: 使用JavaScript和React(对JS有一定扩展)作为开发语言: React ...
- Quill Editor使用公式
const katex = require('katex'); const win: any = window; win.katex = katex; 首先,引入katex @import '~kat ...
- [Objective-C] Copy 和 MutableCopy
看了几篇文章,因为文章很新手向,所以内容很繁琐.故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念.新博客wossoneri.com传送门 非集合类对象的copy与mutableCopy / ...