Android JNI Knowledge

From Table-A  we can learn some primitive data type of JNI.


How to get array from Java?

We can use some methods of JNIEnv object to get array  from Java. And it provide two types of methods that one is that operate simple type of Array, another one is that operate Objects of Array.

So, we can use this kinds of methods "GetXXXArrayElements" to get  array data from Java. Following is the detail:




How to get Field and Method from Java?

The parameters and return values:


Some cases about C use Java


    1. C returns a string
    (*env)->NewStringUTF(env,"hello world"); 


    2. C returns an array 

    {
         int  i = 0;      
         jintArray array;     
         array = (*env)->NewIntArray(env,10);    
         for(;i<10;i++)  { 
             (*env)->SetObjectArrayElement(env,array,i,i*2);   
         }     
         return array;  

    }


     3. C uses input array.

     {
           int sum =0, i;    
           int len = (*env)->GetArrayLength(env,array);
           jint *element = (*env)->GetIntArrayElement(env,array,0);   
           for(i=0;i<len;i++) {      
                sum += *(element+i);
           }   
           return sum; 

     }


    4. C uses Java methods without parameters but return String value. 
    JNIEXPORT jstring JNICALL jni_Demo_getCallBack(JNIENV env,jobject object){
           jmethodID mid;   jclass cls = (*env)->FindClass(env,"jni/Demo"); 
           mid  = (*env)->GetMethodID(env,cls,"Callback","()Ljava/lang/String;");//Callback java
         jstring msg = (*env)->CallObjectMethod(env,object,mid);
           return msg; 
    } 


    5. C use Java static methods without parameters but return String value.     
    JNIEXPORT jstring JNICALL Java_jni_Demo_getCallBack(JNIENV env,jobject object){   
           jmethodID mid;    
         jclass cls = (*env)->FindClass(env,"jni/Demo");  
         mid = (*env)->GeStatictMethodID(env,cls,"Callback","()Ljava/lang/String;");//Callback java 
           jstring msg = (*env)->CallStaticObjectMethod(env,cls,mid); 
           return msg;
    } 


    6. C uses Java with two parameters one is int, another one is String and return String value.    
    JNIEXPORT jstring JNICALL Java_jni_Demo_getCallBack(JNIENV env,jobject object){  
           jmethodID mid;   
           jclass cls = (*env)->FindClass(env,"jni/Demo 
           mid = (*env)->GeStatictMethodID(env,cls,"Callback","(ILjava/lang/String;)Ljava/lang/String;");//Callback
           jstring param = (*env)->NewStringUTF(env,"hello world");     
           jstring msg = (*env)->CallStaticObjectMethod(env,cls,mid,22,param); 
           return msg;
    } 


    7. C uses Java Global Fields 

    {
           jclass cls = (*env)->FindClass(env,"jni/Demo");     
           jfieldID id = (*env)->GetFieldID(env,cls,"gIntNumber","I"); 
           jint param = (*env)->GetIntField(env,object,id);      
           jfieldID id2 = (*env)->GetFieldID(env,cls,"gStrName","Ljava/lang/String"); 
           jstring param = (*env)->GetObjectField(env,object,id); 

     }


     8. C uses Java static Fields

     {
            jclass cls = (*env)->FindClass(env,"jni/Demo");     
            jfieldID id = (*env)->GetStaticFieldID(env,cls,"staticNumber","Ljava/lang/String"); jstring param = (*env)->GeStaticObjectField(env,cls,id); 

     }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值