JNI best practice


就语法而言,JNIAPIC语言的,因而了解API就可以使用JNI了。JNI的意图是为消除JAVAC之间的通信障碍,以便取长补短。Java是纯面向对象语言,除了基本数据类型外,其它的都是引用数据类型。引用数据类型往往是一个类,类中包含了域(field),方法(method)以及类这个整体本身。正因如此,JNI提供了CAPI来处理Java中的类。先look几个常用的API

jclass FindClass(const char* name);
/*找到某个名称为name的类,name是类的完整名称,比如com.processplayer.Process的完整名称为com/processpalyer/Process*/

jfieldID GetFieldID(jclass clazz, const char* name, const char* sig);
/*取得clazz类的名为name的field*/

jmethodID GetMethodID(jclass clazz, const char* name, const char* sig);
/*取得clazz类的名为name的method*/
注: sigsignature的缩写。

1.引用类型的signatureL开头,后接类的完整地址,并以;结尾。例如,

Lcom/processpalyer/Process

2.基本数据类型的signature,如下表

boolean--- Zbyte ---Bchar ---Cshort --- Sint--- Ilong ---J(不用L的原因可能是为了避免与引用类型冲突),float--- Fdouble ---D

3.数组类型的signature[开头,后接基本数据类型(或者引用类型)的signature。例如,

int[]signature[I

Process[]signature[Lcom/processpalyer/Process

多维的数据类型,每多一维,多加一个[。例如,

int[][]signatrue[[I

理解signature之后,就可以很方便得使用GetFieldID取得类的field


4.方法的signature,只需要指定方法的参数类型和返回值类型就OK了。在一对圆括号内连续放置函数参数的signature,在这对括号的右边放置返回值类型的signature。例如,

int GetProcess(int, String)signature(ILjava/lang/String;)I

void GetProcess()signature()V,返回值为空用V表示

构造函数的name<init>,返回值类型的signatureV


创建自定义的java

  1. jni内找到需要创建的java类。Jni中任何一个类都可以用jclass来标识

    jclass processClazz = env->FindClass("swu/processplayer/processlist/Process")

  2. 获取类的构造函数

    jmethodID constructMethod = env->GetMethodID(processClazz, “<init>”,“(Ljava/lang/String;I)V”);

  3. 创建类实例

    jstring processName = env->NewStringUTF(“Erase”);

    jintframeNum = 10;

    jobject processObject = env->NewObject(processClazz, constructMethod,processName, frameNum);

  4. 调用类的方法以改变类的状态

    1. 获取方法

      jmethodID resetMethod = env->GetMethodID(processClazz, “reset”,“()V”);

    2. 调用方法

      env->CallVoidMethod(processObject,resetMethod);

      注:根据方法的返回值不同需要调用不同的Call***Method


方便用法

  1. 查看类的signature

    首先cd到生成的class.dex文件目录,然后javap-s -p classname可以打印出类的完整信息,包括域的signature和方法的signature

  2. 其它


关键点小结

  1. 创建类实例仅能使用NewObject一个方法,但是调用类方法却要根据返回值调用不同的Call***Method方法。

  2. 创建String对象,可方便得调用NewStringUTF函数

  3. 获取MethodID时,构造函数的name为”<init>”




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值