Jni开发代码简介

15 篇文章 0 订阅
3 篇文章 0 订阅

JNI中方法参数:

jstring Java_com_utils_INative_stringFromJNI(JNIEnv* env,

jobject thiz, jstring obj) {
return (*env)->NewStringUTF(env, "XXX");

}

此方法中有三个参数:

第一个env是结构体的函数表-->JavaNativeInterface的接口。

第二个参数thiz区别当前方法为静太方法或者实例方法,当方法是一个实例方法时,则此参数相当于对象本身,即类似this关键字; 当方法为一个静态方法时,thiz将指向所在的类。

第三个参数obj则是由java定义时传过来的参数,类型可多种类型。


在JNI中数据类型对应时,C/C++的类型格式是:在java的数据类型前加上"j"。如:int --->jint 

而Java中的“String” 则需要通过env->NewStringUTF(env, "");来得到“jstring"对应其类型,除此之外,在jni中还定义了'jclass'对应java中的"Class"类、“jobject”对应java中的“Object”。


字符串转换:

   char * c ;

   c = env->GetStringUTFChars(env, obj, null);//可返回char

   env->RealeseStringUTFChars(env, obj, c);//销毁GetStringUTFChars时分配的内存

   jstring str  = env->NewStringUTF(env, c);


获取Java类的成员并修改:

Java:

class InstanceFieldAccess {
     private String s;
     private native void accessField();
     public static void main(String args[]) {
     InstanceFieldAccess c = new InstanceFieldAccess();
     c.s = "abc";
     c.accessField();
     System.out.println("In Java:");
     System.out.println(" c.s = \"" + c.s + "\"");
     }
    static {
          System.loadLibrary("InstanceFieldAccess");
    }
}

C:

JNIEXPORT void JNICALLJava_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj){ 
     jfieldID fid; /* store the field ID */  
     jstring jstr;  
     const char *str;  /* Get a reference to obj’s class */
     jclass cls = (*env)->GetObjectClass(env, obj);  

     fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");  
     printf("In C:\n");
     if (fid == NULL) {    
          return; /* failed to find the field */ 
     }    
     jstr = (*env)->GetObjectField(env, obj, fid);  
     str = (*env)->GetStringUTFChars(env, jstr, NULL);  
     if (str == NULL) {    
          return; /* out of memory */
     }  
     printf(" c.s = \"%s\"\n", str);
     (*env)->ReleaseStringUTFChars(env, jstr, str);  /* Create a new string and overwrite the instance field */  
     jstr = (*env)->NewStringUTF(env, "123");  
     if (jstr == NULL) {    
          return; /* out of memory */ 
     }  
     (*env)->SetObjectField(env, obj, fid, jstr);
}

输出:

     In C:     c.s = "abc"     In Java:     c.s = "123"


访问对象成员分两步,首先通过 GetFieldID 得到对象成员 ID, 如下:fid =(*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
示例代码,通过 GetObjectClass 从 obj 对象得到 cls.这时,通过在对象上调用下述方法获得成员的值:jstr =(*env)->GetObjectField(env, obj, fid);
示例中要得到的是一个对象类型,所以用 GetObjectField. 此外 JNI 还提供Get/SetIntField,Get/SetFloatField 访问不同类型成员。
译者:通过 JNI 方法访问对象的成员,JNI 对应的函数命名非常有规律,即 Get/Set<ReturnValue Type>Field。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值