JNI 에서 string, char *, jstring 두 가지 변환
// 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;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.