2015年5月12日 星期二

jni 數據轉換

比較麻煩的事,
string 傳進 jni裡要多一道手續,return時也一樣
【轉貼 黑夜的博客
用GetStringUTFChars問題多多,還是用Jstring2CStr這個function好 ref: Here
char *Jstring2CStr(JNIEnv *env, jstring jstr)
{
     char *rtn = NULL;
     jclass clsstring = (*env)->FindClass(env,"java/lang/String");
     jstring strencode = (*env)->NewStringUTF(env,"UTF8");
     jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");  
     jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
     jsize alen = (*env)->GetArrayLength(env,barr);
     jbyte *ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
     if(alen > 0)  
     {
      rtn = (char*)malloc(alen+1); //"\0"  
      memcpy(rtn,ba,alen);  
      rtn[alen]=0;  
     }
     (*env)->ReleaseByteArrayElements(env,barr,ba,0);
     return rtn;
}


//获取,返回 string  
JNIEXPORT jstring JNICALL Java_com_test_Test_getString(JNIEnv * env,  
  jobject obj, jstring s) {  
 char * st = (char *) (*env)->GetStringUTFChars(env, s, 0);  
 printf("\n c-string:  %s", st);  
  
 char * str = "hello wang wu!";  
 jstring rtn;  
 rtn = (*env)->NewStringUTF(env, str);  
 return rtn;  
}

//获取,返回 string []  
JNIEXPORT jobjectArray JNICALL Java_com_test_Test_getStringArray(JNIEnv * env,  
  jobject obj, jobjectArray arr) {  
 int len = (*env)->GetArrayLength(env, arr);  
 printf("\n c-stringArray :");  
 int i = 0;  
 for (i = 0; i < len; i++) {  
  jobject obj = (*env)->GetObjectArrayElement(env, arr, i);  
  jstring str = (jstring) obj;  
  const char * szStr = (*env)->GetStringUTFChars(env, str, 0);  
  printf(" %d-%s ", i, szStr);  
  (*env)->ReleaseStringChars(env, str, szStr);  
 }  
 //-----返回----  
 jstring str;  
 jobjectArray args = 0;  
 jsize size = 5;  
 char* sa[] = { "Hello,", "world!", "zhang", "san", "yuang" };  
 int j = 0;  
 jclass objClass = (*env)->FindClass(env, "java/lang/String");  
 args = (*env)->NewObjectArray(env, size, objClass, 0);  
 for (j = 0; j < size; j++) {  
  str = (*env)->NewStringUTF(env, sa[j]);  
  (*env)->SetObjectArrayElement(env, args, j, str);  
 }  
 return args;  
}
其它的寫法一樣

另外,Android Jni中使用线程及回调更新UI 這個方法很重要

ref :
黑夜的博客
铁彬的博客

沒有留言:

張貼留言