Android JNI 數據類型轉換


基本數據類型轉換

Java類型      別名          C++本地類型        字節(bit)  
boolean      jboolean       unsigned  char    8, unsigned  
byte         jbyte          signed  char     8  
char         jchar          unsigned  short   16, unsigned  
short        jshort          short            16  
int          jint            long             32  
long         jlong          __int64          64  
float        jfloat          float             32  
double       jdouble         double            64   


也就說基本數據類型就可以直接轉換了 ,比較麻煩的是char * 和jstring類型的呼喚,查看jni.h 

可以知道有如下方法:

jstring 轉 char *

 

  const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);
   // 使用nativeString

   (*env)->ReleaseStringUTFChars(env, javaString, nativeString); 

 

char * 轉 jstring  (未測試)

 

      jstring  jstr = (*env)->NewStringUTF(char *utf)  

 

     //  // 使用jstr

 

      (*env)->ReleaseStringUTFChars(env, jstr, utf); 

 

String 轉 jstring

 

String str = "test";
jstring jstr= m_jEnv->NewStringUTF(str.utf8().data());

//刪除java對象 jstr 

pEnv->DeleteLocalRef(jstr);  

 

 

static jstring stoJstring(JNIEnv* env, const char* pat)
{
       jclass strClass = (*env)->FindClass(env, "Ljava/lang/String;");
       jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>", "([BLjava/lang/String;)V");
       jbyteArray bytes = (*env)->NewByteArray(env, strlen(pat));
       (*env)->SetByteArrayRegion(env, bytes, 0, strlen(pat), (jbyte*)pat);
       jstring encoding = (*env)->NewStringUTF(env, "utf-8"); 
       return (jstring)(*env)->NewObject(env, strClass, ctorID, bytes, encoding);
}

static char* jstringTostring(JNIEnv* env, jstring jstr)
{
       char* rtn = NULL;
       jclass clsstring = (*env)->FindClass(env, "java/lang/String");
       jstring strencode = (*env)->NewStringUTF(env, "utf-8");
       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);
                 memcpy(rtn, ba, alen);
                 rtn[alen] = 0;
       }
       (*env)->ReleaseByteArrayElements(env, barr, ba, 0);
       return rtn;
} 

 


 

很多方法可以參考jni.h 


 搜索到這個人的博客,總結的不錯 

JNI的提高,Java類型和C(C++)類型轉換源代碼

http://blog.csdn.net/ostrichmyself/article/details/4557851 

 

JNI 的多線程

 http://blog.csdn.net/popop123/article/details/1511180

 


 

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM