Android技术分享程序员

JNI与原生代码之间的通信

2017-09-11  本文已影响77人  桂慧要努力当个攻城师

JNI定义

JNI是Java程序设计语言功能最强的特征,它允许Java类的某些方法原生实现,同时让它们能够像普通Java方法一样被调用和使用。

方法声明。

原生方法中必须存在的两个参数:JNIEnv*,jobject。第一个参数JNIEnv是指向JNI函数列表的接口指针,第二个参数jobject是获取类引用或实例引用。

JNIEnv接口指针

实例方法与静态方法

静态方法和实例方法均可以声明为原生的,可以通过JNI技术以源生代码的形式提供实现。

数据类型

Java类型 JNI类型 C/C++类型 大小
boolean jblloean unsigned char 无符号8位
bety jbyte char 有符号8位
char jchar unsigned short 无符号16位
short jshort short 有符号16位
int jnit int 有符号32位
long jlong long long 有符号64位
float jfloat float 32位
double jdouble double 64位
Java类型 原生类型
java.lang.Class jclass
java.lang.Throwable jthrowable
java.lang.String jstring
Other objects jobjects
java.lang.Object[] jobjectArray
boolean[] jbooleanArray
byte[] jbyteArray
char[] jcharArray
short[] jshortArray
int[] jintArray
long[] jlongArray
float[] jfloatArray
double[] jdoubleArray
Other arrays jarray

对引用数据类型的操作

引用类型以不透明的引用方式传递给原生代码,而不是以原生数据类型的形式呈现,因此引用类型不能直接使用和修改。

NIO 操作

原生I/O(NIO)在缓冲管理区,大规模网络和文件I/O及字符集支持方面的性能有所改进。JNI提供了原生代码中使用NIO的函数。

unsigned char* buffer = (unsigned char*) malloc(1024);
jobject directBuffer;
directBuffer = (*env)->NewDirectByteBuffer(env,buffer,1024);

原生方法中的内存分配超出了虚拟机的管理范围,且不能用虚拟机的垃圾回收器回收原生方法中的内存。原生方法应该通过释放未使用的内存分配以避免内存泄漏来正确管理内存

unsigned char* buffer;
buffer = (unsigned char*)(*env)->GetDirectBufferAddress(env,directBuffer);

访问域

public class JavaClass {
    private String instanceField = "Instance Field";
    private static String staticField = "static Field";
}

调用方法

public class JavaClass {
  private String instanceMethod(){
    return "Instance Method";
  }
  private static String staticMethod(){
    return "Static Method";
  }
}

调用方法

(*env)->CallStringMethod(env,instance,instanceMethodId);
(*env)->CallStaticStringMethod(env,instance,staticMethodId );

域和方法描述

外部工具程序配置
上一篇 下一篇

猜你喜欢

热点阅读