The Conversion Of JNI

1.j***Array<->***[] (c++,not C)

you can use

jsize theArrayLength = env->GetArrayLength(arraySrc);

to get the length of the array;

jbyteArray->BYTE[]

#define BYTE unsigned char

jbyte * arrayTemp=env->GetByteArrayElements(arraySrc,0);//arraySrc is jbyteArray 

BYTE *arrayRet= (BYTE *)arrayTemp;

or

#define BYTE unsigned char
BYTE *arrayRet= (BYTE *)env->GetByteArrayElements(arraySrc,0);//arraySrc is jbyteArray

BYTE[]>jbyteArray

jbyte *arrayTemp = (jbyte*)arraySrc;  //arraySrc is BYTE[] 

jbyteArray arrayRet = env->NewByteArray(arraySize);  

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

or

jbyteArray arrayRet = env->NewByteArray(arraySize);  

env->SetByteArrayRegin(jarray, 0, nOutSize,  (jbyte*)arraySrc );

jbyteArray–>char *

char* arrayRet= (char*)env->GetByteArrayElements(arraySrc, 0);

jintArray->int[]

jint * arrayTemp= env->GetIntArrayElements(arraySrc,0);//arraySrc is jintArray

int * arrayRet= (int *)arrayTemp;

2.String

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*

1.

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

env->ReleaseStringUTFChars(str, key);



2.

jint

Java_com_wzh_test_AndriodJNISampleActivity_add( JNIEnv* env,jobject this,jstring path)

{



  const char *folder = (*env)->GetStringUTFChars(env, path, 0);



  (*env)->ReleaseStringUTFChars(env, path, folder);



  ......



}

 

jstring to char*  (not mine)

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(not mine)

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);  

}

3.

JNI return 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;  

}

or you can create a byte[] first ,fill it ,and assign it to firstMacArray by SetByteArrayRegion

BYTE *temp=new BYTE[10];

.......

env->SetIntArrayRegion(firstMacArray, 0,arraySize, (jbyte *)temp);

get byte[] from the coming object

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

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

jsize theArrayLeng = env->GetArrayLength(pDataIn);

assign values to a variables of a object

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

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

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

你可能感兴趣的:(conversion)