3.5 String转字符串的另一种

由于在Java中采用宽字符数组来表示字符串,而宽字符在C++中支持并不是很好(C++习惯\0表示结束,而宽字符可能有许多位置都是0),所以当两个语言通过jni调用时,如果需要传递字符串参数,那么必须要通过转换才可以。

string BCJ2C(JNIEnv* env, jstring jstr)

{

  char* ret = NULL;

  jclass JStrClass = env->FindClass("java/lang/String");
  jstring Codec = env->NewStringUTF("utf-8");
  jmethodID getBytes = env->GetMethodID(JStrClass, "getBytes", "(Ljava/lang/String;)[B");
  jbyteArray JBytes = (jbyteArray)env->CallObjectMethod(jstr, getBytes, Codec);
  jsize byteLen = env->GetArrayLength(JBytes);

  jbyte* JBuffer = env->GetByteArrayElements(JBytes, JNI_FALSE);
  if (byteLen > 0)
  {
    ret = (char*)malloc(byteLen + 1);
    memcpy(ret, JBuffer, byteLen);
    ret[byteLen] = 0;
  }

  env->ReleaseByteArrayElements(JBytes, JBuffer, 0);

  if(ret) {
    string tmp(ret);
    free(ret);
    return string(ret);
  }

   return string();

}

jstring BCC2J(JNIEnv* env, string str)
{
  env->NewStringUTF(str.c_str());
}

results matching ""

    No results matching ""