【译文】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 ...
随机推荐
- Oracle学习笔记八 表空间
表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 . 分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下 ...
- 基于面向对象的图片轮播(js原生代码)
无论你想走多远,你都需要不断地走下去.前端最精华的便是原生的js,这也是我们前端工程师的技术分层的重要指标,也提现这你的代码能力,开发的水平.废话不多说,进入今天的主要分享————基于面向对象思想的图 ...
- html基础起航
废话不多说,直接上例子! 工欲善其事,必先利其器 浏览器要有吧~ 比如:IE.Chrome.Firefox…… 纯文本编辑软件不可少~ 比 ...
- GNU Readline 库及编程简介
用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以用来命令补全 ↑ 或 ↓ 键可以用来快速输入历史命令 还有一些交互式行编辑快捷键: C-A / C-E 将光标移到行首/行尾 C ...
- 数据库 数据库SQL语句二
单行函数 --操作数据对象 --接受参数返回一个结果 --只对一行进行变换 --每行返回一个结果 --可以转换数据类型 --可以嵌套 --参数可以是一列或一个值 字符函数 SQL> select ...
- FineUI(专业版)公测版发布(这速度,真TM快!)
经过近一年的筹备.编码和测试,FineUI(专业版)公测版终于和大家见面了!现在就来体验一下专业版飞一般的速度吧:http://fineui.com/demo_pro/FineUI(专业版)首页:ht ...
- Android中关于cpu/cpuset/schedtune的应用
Android中关于cpu/cpuset/schedtune的应用都是基于进程优先级的,根据不同优先级划分进程类型.AMS(ActivityManagerService)和PMS(PackageMan ...
- 基于bootstrap样式的tree,
<!doctype html><html lang="zh"><head> <meta charset="UTF-8" ...
- mysql 多版本并发控制
查看事务隔离级别 SHOW VARIABLES LIKE "%iso%" MVCC 通过给每张表多加两个隐藏列来实现,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间), ...
- root与普通用户的切换
普通用户切换到root用户:sudo su - root用户切换到普通用户:su henie