Android JNI中的 類型轉換

//jbytearray轉c++byte數組

jbyte * arrayBody = env->GetByteArrayElements(data,0); 
jsize theArrayLengthJ = env->GetArrayLength(data); 
BYTE * starter = (BYTE *)arrayBody;


//jbyteArray 轉 c++中的BYTE[] 

//jbytearray array

jbyte * olddata = (jbyte*)env->GetByteArrayElements(array, 0);

jsize  oldsize = env->GetArrayLength(array);

BYTE* bytearr = (BYTE*)olddata;

int len = (int)oldsize;


//C++中的BYTE[]轉jbyteArray

//nOutSize是BYTE數組的長度 BYTE pData[]

jbyte *by = (jbyte*)pData;

jbyteArray jarray = env->NewByteArray(nOutSize);

env->SetByteArrayRegin(jarray, 0, nOutSize, by);



//jbyteArray 轉 char *

char* data = (char*)env->GetByteArrayElements(strIn, 0);


//char* 轉jstring

jstring WindowsTojstring(JNIEnv* env, char* str_tmp)

{

    jstring rtn=0;

    int slen = (int)strlen(str_tmp);

    unsigned short* buffer=0;

    if(slen == 0)

    {

        rtn = env->NewStringUTF(str_tmp);

    }

    else

    {

        int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);

        buffer = (unsigned short*)malloc(length*2+1);

        if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) > 0)

        {

            rtn = env->NewString((jchar*)buffer, length);

        }

    }

    if(buffer)

    {

        free(buffer);

    }

    return rtn;

}



//jstring 轉 char* 或者 const char* 

// jstring str

const char *key = env->GetStringUTFChars(str, 0);

//jboolean isOffer

jsClient->modify(key, isOffer);

//需要釋放,否則容易內存泄露

env->ReleaseStringUTFChars(str, key);



//JNI 返回 jbyteArray

JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env, jobject obj)

{

    jbyteArray firstMacArray = env->NewByteArray( 6 );

    ......

    jbyte *bytes = env->GetByteArrayElements( firstMacArray, 0);

    for ( int i = 0; i < sizeof( pAdapterInfo->Address ); i++ )

    {

       bytes[ i ] = pAdapterInfo->Address[ i ];

    }


    env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );

    return firstMacArray;

}



//jstring to char*

char* jstringTostring(JNIEnv* env, jstring jstr)

{        

    char* rtn = NULL;

    jclass clsstring = env->FindClass("java/lang/String");

    jstring strencode = env->NewStringUTF("utf-8");

    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");

    jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);

    jsize alen = env->GetArrayLength(barr);

    jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);

    if (alen > 0)

    {

        rtn = (char*)malloc(alen + 1);

        memcpy(rtn, ba, alen);

        rtn[alen] = 0;

    }

    env->ReleaseByteArrayElements(barr, ba, 0);

    return rtn;

}



////char* to jstring

jstring stoJstring(JNIEnv* env, const char* pat)

{

    jclass strClass = env->FindClass("Ljava/lang/String;");

    jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");

    jbyteArray bytes = env->NewByteArray(strlen(pat));

    env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);

    jstring encoding = env->NewStringUTF("utf-8");

    return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);



//將jstring類型轉換成windows類型 

char* jstringToWindows( JNIEnv *env, jstring jstr )

{

    int length = (env)->GetStringLength(jstr );

    const jchar* jcstr = (env)->GetStringChars(jstr, 0 );

    char* rtn = (char*)malloc( length*2+1 );

    int size = 0;

    size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );

    if( size <= 0 )

    return NULL;

    (env)->ReleaseStringChars(jstr, jcstr );

    rtn[size] = 0;

    return rtn;

}



//將windows類型轉換成jstring類型 

jstring WindowsTojstring( JNIEnv* env, char* str )

{

    jstring rtn = 0;

    int slen = strlen(str);

    unsigned short * buffer = 0;

    if( slen == 0 )

        rtn = (env)->NewStringUTF(str );

    else

    {

        int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );

        buffer = (unsigned short *)malloc( length*2 + 1 );

        if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )

            rtn = (env)->NewString( (jchar*)buffer, length );

    }

    if( buffer )

        free( buffer );

    return rtn;

}

/*JNIEXPORT jstring JNICALL Java_test_cs_web_SWIFTAlianceCASmfTest_strcal

(JNIEnv *env, jclass obj, jstring jstr1, jstring jstr2)

{

    jbyteArray bytes = 0;

    jthrowable exc;

    char *pszResult = NULL;    

    char *pszSTR1 = NULL;

    char *pszSTR2 = NULL;


    pszSTR1 = jstringTostring(env, jstr1);

    pszSTR2 = jstringTostring(env, jstr2);



    int nlen = sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2));

    pszResult = (char*)malloc(nlen);

    strcpy(pszResult, pszSTR1);

    strcat(pszResult, pszSTR2);


    jstring jstrRe = stoJstring(env, pszResult);

    free(pszSTR1);

    free(pszSTR2);

    free(pszResult);

    return(jstrRe);

}

*/



//從傳進來的對象中取出byte[] 

jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");

jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn, byteData);

jsize theArrayLeng = env->GetArrayLength(pDataIn);


//byte[]轉爲BYTE[] 

jbyte * arrayBody = env->GetByteArrayElements(pDataIn,0); 

BYTE * jDataIn = (BYTE *)arrayBody; 



//將BYTE數組轉爲jarray 

jbyte* byte = (jbyte*)jDataOut;    

jbyteArray jarray = env->NewByteArray(theArrayLeng);

env->SetByteArrayRegion(jarray, 0, theArrayLeng, byte);


//給每一個實例的變量付值 

(env)->SetObjectField(objDataIn,byteData,jarray);

(env)->SetIntField(objDataIn,pDataInLen,jDataInLen);

(env)->ReleaseByteArrayElements(pDataIn, arrayBody, 0); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章