Data type conversion Android JNI

This switched https://www.cnblogs.com/likwo/archive/2012/05/22/2512483.html

I have not verified the specific content.

Basic data type conversion

Java native C ++ type alias type byte ( '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 the __int64 64  
a float         jfloat          a float             32  
Double        jdouble         Double            64   

 

 

Also said that the basic data types can be directly converted, more trouble is jstring type char * and call to see jni.h 

There may be a method to know:

jstring turn char *

 

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

   // use nativeString

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

 

char * turn jstring (not tested)

 

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

 

     // // Use jstr

 

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

 

String 转 jstring

 

String str = "test";

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

// delete java object 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;
} 

 

 

 

Many ways to refer jni.h 

 

 Search this person's blog, a good summary 

Improve the JNI, Java type and C (C ++) source casts

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

 

JNI multithreading

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

 

lknlfy's blog

Guess you like

Origin blog.csdn.net/qiuchangyong/article/details/89679938