原文链接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html  

没有逐字翻译,解说了文章的大致意思,需要了解细节的请看原文~

1. 介绍:

  有时候我们需要Native code(c/c++)来克服Java中的内存管理和性能约束。 Java通过JVM提供的JNI功能达到了这个目的。JNI涉及到两种语言和运行时环境,所以比较难点。这里我假设你对Java,c/c++,相关IDE比较熟悉。

2. 开始

2.1   在Java中使用C:

  1. 在Java类中声明相应的方法为native方法
  2. 使用javah工具生成相应的头文件
  3. 编写对应的c源文件(包含对应的头文件,实现里面声明的函数)
  4. 编写Makefile
  5. 运行包含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基础

  1. Java的原始类型:JNI 中的类型和对应的Java中的类型 
    jint jbyte jshort jlong jfloat jdouble jchar jboolean 
    int   byte  short  long  float  double  char  boolean
  2. Java的引用类型(reference type): jobject 对应 java.lang.Object
    1. jclass 对应 java.lang.Class
    2. jstring 对应java.lang.String
    3. jthrowable 对应java.lang.Throwable
    4. jarray表示Java的数组
  3. 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编程的更多相关文章

  1. 在 JNI 编程中避免内存泄漏

    JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...

  2. NDK(22)JNI编程如何避免常见缺陷

    转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html 避免常见缺陷 假设您编写了一些新 JNI 代码,或者继承了别处的某些 J ...

  3. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  4. JNI编程(二) —— 让C++和Java相互调用(2)

    3.getRamdomOrder() 这个方法会从backend得到一个随机的Order对象(抱歉这里“Random”拼错了),然后再调用java中相应的通知方法来通知foreground.getRa ...

  5. JNI编程(二) —— 让C++和Java相互调用(1)

    自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...

  6. 【转】android JNI编程 一些技巧(整理)

    原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...

  7. Android中JNI编程的那些事儿(1)

    转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...

  8. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  9. java jni 编程

    最近要学习Java JNI 编程. 我使用的是的windows系统.装了一个cygwin. 根据 <JNI 编程规范和指南>. 文件网址: http://wenku.baidu.com/v ...

  10. android windows 上JNI编程

    昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁.java能够调用JNI来完毕调用C语言实现的方法. JNI的全称是(Java native interfac ...

随机推荐

  1. Oracle学习笔记八 表空间

    表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 .   分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下 ...

  2. 基于面向对象的图片轮播(js原生代码)

    无论你想走多远,你都需要不断地走下去.前端最精华的便是原生的js,这也是我们前端工程师的技术分层的重要指标,也提现这你的代码能力,开发的水平.废话不多说,进入今天的主要分享————基于面向对象思想的图 ...

  3. html基础起航

    废话不多说,直接上例子! 工欲善其事,必先利其器 浏览器要有吧~                       比如:IE.Chrome.Firefox…… 纯文本编辑软件不可少~          比 ...

  4. GNU Readline 库及编程简介

    用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以用来命令补全 ↑ 或 ↓ 键可以用来快速输入历史命令 还有一些交互式行编辑快捷键: C-A / C-E 将光标移到行首/行尾 C ...

  5. 数据库 数据库SQL语句二

    单行函数 --操作数据对象 --接受参数返回一个结果 --只对一行进行变换 --每行返回一个结果 --可以转换数据类型 --可以嵌套 --参数可以是一列或一个值 字符函数 SQL> select ...

  6. FineUI(专业版)公测版发布(这速度,真TM快!)

    经过近一年的筹备.编码和测试,FineUI(专业版)公测版终于和大家见面了!现在就来体验一下专业版飞一般的速度吧:http://fineui.com/demo_pro/FineUI(专业版)首页:ht ...

  7. Android中关于cpu/cpuset/schedtune的应用

    Android中关于cpu/cpuset/schedtune的应用都是基于进程优先级的,根据不同优先级划分进程类型.AMS(ActivityManagerService)和PMS(PackageMan ...

  8. 基于bootstrap样式的tree,

    <!doctype html><html lang="zh"><head> <meta charset="UTF-8" ...

  9. mysql 多版本并发控制

    查看事务隔离级别 SHOW VARIABLES LIKE "%iso%" MVCC 通过给每张表多加两个隐藏列来实现,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间), ...

  10. root与普通用户的切换

    普通用户切换到root用户:sudo su - root用户切换到普通用户:su henie