原文链接: 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. python-open文件处理

    python内置函数open()用于打开文件和创建文件对象 语法 open(name[,mode[,bufsize]]) name:文件名 mode:指定文件的打开模式 r:只读 w:写入 a:附加 ...

  2. python列表模拟堆栈和队列

    对列特点:先进先出.后进后出 用列表insert.pop模拟进队出队: >>> l = [] >>> l.insert(0,'p1') >>> l ...

  3. SqlServer SET IDENTITY_INSERT ON | OFF

    想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 示例: 1.首先建立一个有标识列的表: )) 2.尝试在表中做以下操作: , 'gar ...

  4. [LeetCode] Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵

    An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...

  5. 怎样简单灵活地将DataTable中的数据赋值给model

    最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去.每个方法都 ...

  6. c#枚举使用详解

    简介 1. 枚举(enum type)通常用来表示一组常量.由于枚举是强类型的,这在编程中给我们提供了极大的方便. 2. 枚举的定义: public enum Sex { 男 = 0, 女 = 1 } ...

  7. 5G承载为什么需要三层到边缘

  8. @RenderSection,@RenderPage,@RenderBody介绍

    在MVC的模板页中会用到上面三个东西,那么今天就简单归纳下各有什么作用 1.@RenderSection 用法 对CSS或JS部分模块的预留定义 例如模板页定义了@RenderSection(&quo ...

  9. [翻译] Android是怎样绘制视图的

    原文:How Android Draws Views 当一个Activity获取到焦点的时候,它的布局就开始被绘制. 绘制的过程由Android framework处理.但布局层级的根节点必须由Act ...

  10. How to Disable Strict SQL Mode in MySQL 5.7

    If your app was written for older versions of MySQL and is not compatible with strict SQL mode in My ...