【译文】JNI编程
没有逐字翻译,解说了文章的大致意思,需要了解细节的请看原文~
1. 介绍:
有时候我们需要Native code(c/c++)来克服Java中的内存管理和性能约束。 Java通过JVM提供的JNI功能达到了这个目的。JNI涉及到两种语言和运行时环境,所以比较难点。这里我假设你对Java,c/c++,相关IDE比较熟悉。
2. 开始
2.1 在Java中使用C:
- 在Java类中声明相应的方法为native方法
- 使用javah工具生成相应的头文件
- 编写对应的c源文件(包含对应的头文件,实现里面声明的函数)
- 编写Makefile
- 运行包含main方法的Java类(注意设置java.library.path变量)
2.2 在Java中混合c/c++
主要问题是,要明白如何在c源文件中调用c++函数(函数声明的时候要注意使用extern “C")
2.3 JNI相关的包问题
如果包含native方法的类不是在默认包里,就涉及到这个问题,在使用javah的时候需要注意切换到package base directory。
2.4 JNI在Eclipse中的使用
3. JNI基础
- Java的原始类型:JNI 中的类型和对应的Java中的类型
jint jbyte jshort jlong jfloat jdouble jchar jboolean
int byte short long float double char boolean - Java的引用类型(reference type): jobject 对应 java.lang.Object
- jclass 对应 java.lang.Class
- jstring 对应java.lang.String
- jthrowable 对应java.lang.Throwable
- jarray表示Java的数组
- native函数接收Java程序传入的参数,然后转换为本地类型,计算完毕后,把本地结果拷贝到JNItype类型的对象中,然后返回
4. 参数和结果传递
4.1 传递原始类型(primitives)
4.2 传递字符串
// UTF-8 String (encoded to 1-3 byte, backward compatible with 7-bit ASCII)
// Can be mapped to null-terminated char-array C-string
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
// 返回jstring对象中的内部c字符串
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);
// 告诉虚拟机native code不再需要访问jstring的utf
jstring NewStringUTF(JNIEnv *env, const char *bytes);
//新创建一个java.lang.String 对象
jsize GetStringUTFLength(JNIEnv *env, jstring string);
// Returns the length in bytes of the modified UTF-8 representation of a string.
void GetStringUTFRegion(JNIEnv *env, jstring str, jsize start, jsize length, char *buf);
// Translates len number of Unicode characters beginning at offset start into modified UTF-8 encoding
// and place the result in the given buffer buf
4.3 传递原始类型的数组
5. 访问对象
(如何在native code中修改Java对象的值)
5.1 实例变量
5.2 类的静态变量
5.3 方法调用
5.4 调用overridden的方法
6. 创建对象和对象数组
7. Local和Global 引用
classInteger = (*env)->FindClass(env, "java/lang/Integer"); //这里获得是Local 引用,即使保存的全局变量里,下次也不能使用,所以需要重新申请,或者像下面这样: // Get a class reference for java.lang.Integer if missing
if (NULL == classInteger) {
printf("Find java.lang.Integer\n");
// FindClass returns a local reference
jclass classIntegerLocal = (*env)->FindClass(env, "java/lang/Integer");
// Create a global reference from the local reference
classInteger = (*env)->NewGlobalRef(env, classIntegerLocal);
// No longer need the local reference, free it!
(*env)->DeleteLocalRef(env, classIntegerLocal);
}
原文链接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
【译文】JNI编程的更多相关文章
- 在 JNI 编程中避免内存泄漏
JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...
- NDK(22)JNI编程如何避免常见缺陷
转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html 避免常见缺陷 假设您编写了一些新 JNI 代码,或者继承了别处的某些 J ...
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- JNI编程(二) —— 让C++和Java相互调用(2)
3.getRamdomOrder() 这个方法会从backend得到一个随机的Order对象(抱歉这里“Random”拼错了),然后再调用java中相应的通知方法来通知foreground.getRa ...
- JNI编程(二) —— 让C++和Java相互调用(1)
自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...
- 【转】android JNI编程 一些技巧(整理)
原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...
- Android中JNI编程的那些事儿(1)
转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- java jni 编程
最近要学习Java JNI 编程. 我使用的是的windows系统.装了一个cygwin. 根据 <JNI 编程规范和指南>. 文件网址: http://wenku.baidu.com/v ...
- android windows 上JNI编程
昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁.java能够调用JNI来完毕调用C语言实现的方法. JNI的全称是(Java native interfac ...
随机推荐
- Linux运维之基础拾遗
第一部分 Linux常用文件管理命令 1.1 cp 文件复制 常用选项 -i # 覆盖之前提醒用户确认 -f # 强制覆盖目标文件 -r # 递归复制目录 -d # 复制符号链接本身而非其指向的源文件 ...
- 基于corosync+pacemaker+drbd+LNMP做web服务器的高可用集群
实验系统:CentOS 6.6_x86_64 实验前提: 1)提前准备好编译环境,防火墙和selinux都关闭: 2)本配置共有两个测试节点,分别coro1和coro2,对应的IP地址分别为192.1 ...
- [jquery]将当前时间转换成yyyymmdd格式
如题: function nowtime(){//将当前时间转换成yyyymmdd格式 var mydate = new Date(); var str = "" + mydate ...
- [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图
行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...
- ubuntu 14.04安装pypcap
直接sudo apt-get install python-pypcap即可 How to install python-pypcap on Ubuntu 12.04 (Precise Pangoli ...
- 在ASP.NET Core中实现一个Token base的身份认证
注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and authorization in ASP.NET Core 在 ...
- .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别
经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...
- Spring缓存机制的理解
在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...
- mybatis 调用存储过程
<select id="selectGenCodeBySql" parameterType="hashmap" statementType="C ...
- 日历插件FullCalendar应用:(二)数据增删改
接上一篇 日历插件FullCalendar应用:(一)数据展现. 这一篇主要讲使用fullcalendar插件如何做数据的增删改,用到了art.dialog web对话框组件,上一篇用到的webFor ...