JNI 에서 string, char *, jstring 두 가지 변환

char * 와 jstring 의 첫 번 째 상호 변환 쓰기 (MinGW 헤더 파일 사용):
//   jvm c++         ,      。 utf8/16   gb2312
char* jstringToChar(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;
}

//   jvm c++         ,      。gb2312   utf8/16
jstring charTojstring(JNIEnv* env, const 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);
        //     
        free(buffer);
    }
    return rtn;
}

char * 와 jstring 두 번 째 상호 변환 쓰기:
jstring charTojstring(JNIEnv* env, const char* pat) {
    //  java String  strClass
    jclass strClass = (env)->FindClass("Ljava/lang/String;");
    //  String(byte[],String)    ,     byte[]        String
    jmethodID ctorID = (env)->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
    //  byte  
    jbyteArray bytes = (env)->NewByteArray(strlen(pat));
    // char*    byte  
    (env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*) pat);
    //   String,       ,  byte     String    
    jstring encoding = (env)->NewStringUTF("GB2312");
    // byte     java String,   
    return (jstring) (env)->NewObject(strClass, ctorID, bytes, encoding);
}

char* jstringToChar(JNIEnv* env, jstring jstr) {
    char* rtn = NULL;
    jclass clsstring = env->FindClass("java/lang/String");
    jstring strencode = env->NewStringUTF("GB2312");
    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;
}

string 과 jstring 은 서로 변환 합 니 다:
string 을 jstring 으로 변환 합 니 다: 보통 string 을 char * 로 변환 한 다음 에 char * 를 jstring 으로 변환 합 니 다. 예제:
   std::string str = "abc";
   // string   char*
   char* chardata = str.c_str();
   // char*   string
   jstring jstr = charTojstring(env, chardata);

jstring 을 string 으로 변환 합 니 다: 보통 jstring 을 char * 로 변환 한 다음 에 char * 를 string 으로 변환 합 니 다. 예제:
   // jstring   char*
   char* chardata = jstringToChar(env, jstr);
   // char*   string
   std::string str = charData;

좋은 웹페이지 즐겨찾기