JNI文字列操作
6848 ワード
jstring NewString(const jchar* unicodeChars, jsize len)
{ return functions->NewString(this, unicodeChars, len); }
このメソッドは、(Unicode)char配列を使用してjava Stringオブジェクトを生成し、返します.jstring stringFromJNI(JNIEnv *env, jobject thiz){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jchar* data = new jchar[5];
data[0] = 'h';
data[1] = 'e';
data[2] = 'l';
data[3] = 'l';
data[4] = 'o';
return env->NewString(data, 5);
}
jsize GetStringLength(jstring string)
{ return functions->GetStringLength(this, string); }
java文字列の長さ(Unicode)jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jint length = env->GetStringLength(s);
__android_log_print(ANDROID_LOG_INFO, "native", "string length:%d", length);
return s;
}
const jchar* GetStringChars(jstring string, jboolean* isCopy)
{ return functions->GetStringChars(this, string, isCopy); }
void ReleaseStringChars(jstring string, const jchar* chars)
{ functions->ReleaseStringChars(this, string, chars); }
GetStringCharsメソッドは、java Stringオブジェクトに対応する(Unicode)char配列ポインタを返すために使用され、返されるポインタはjava Stringオブジェクトを指すか、jni内のコピーを指すか、パラメータisCopyはコピーであるかどうかを返すために使用される.ReleaseStringCharsメソッドはjava Stringオブジェクトにバインドされた(Unicode)char配列ポインタを解放するために使用されます.GetStringCharsメソッドの戻り値はconstで修飾されるため、取得した(Unicode)char配列は変更できない.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jboolean isCopy = JNI_FALSE;
jsize length = env->GetStringLength(s);
const jchar* chars = env->GetStringChars(s, &isCopy);
for(int i = 0; i < length; i++){
__android_log_print(ANDROID_LOG_INFO, "native", "char %c", chars[i]);
}
env->ReleaseStringChars(s, chars);
return s;
}
jstring NewStringUTF(const char* bytes)
{ return functions->NewStringUTF(this, bytes); }
このメソッドは、(UTF-8)char配列を使用してjava Stringオブジェクトを生成し、返します.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
jsize GetStringUTFLength(jstring string)
{ return functions->GetStringUTFLength(this, string); }
はjava Stringの長さ(UTF-8)を返します.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jint length = env->GetStringUTFLength(s);
__android_log_print(ANDROID_LOG_INFO, "native", "length: %d", length);
return s;
}
const char* GetStringUTFChars(jstring string, jboolean* isCopy)
{ return functions->GetStringUTFChars(this, string, isCopy); }
void ReleaseStringUTFChars(jstring string, const char* utf)
{ functions->ReleaseStringUTFChars(this, string, utf); }
GetStringCharsメソッドはjava Stringオブジェクトに対応する(UTF-8)char配列ポインタを返すために使用され、返されるポインタはjava Stringオブジェクトを指すか、jni内のコピーを指すかのいずれかであり、パラメータisCopyはコピーであるかどうかを返すために使用される.ReleaseStringCharsメソッドはjava Stringオブジェクトにバインドされた(UTF-8)char配列ポインタを解放するために使用される.GetStringCharsメソッドの戻り値はconstで修飾されるため、取得した(UTF-8)char配列は変更できない.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jboolean isCopy = JNI_FALSE;
jsize length = env->GetStringUTFLength(s);
const char* chars = env->GetStringUTFChars(s, &isCopy);
for(int i = 0; i < length; i++){
__android_log_print(ANDROID_LOG_INFO, "native", "char %c", chars[i]);
}
env->ReleaseStringUTFChars(s, chars);
return s;
}
void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)
{ functions->GetStringRegion(this, str, start, len, buf); }
java String指定範囲の文字をjniローカル(Unicode)にコピーします.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jchar* chars = new jchar[5];
env->GetStringRegion(s, 0, 5, chars);
return env->NewString(chars, 5);
}
void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)
{ return functions->GetStringUTFRegion(this, str, start, len, buf); }
java String指定範囲の文字をjniローカル(UTF-8)にコピーします.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
char* chars = new char[5];
env->GetStringUTFRegion(s, 0, 5, chars);
return env->NewStringUTF(chars);
}
void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy)
{ return functions->GetPrimitiveArrayCritical(this, array, isCopy); }
void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode)
{ functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); }
GetStringCritical、ReleaseStringCriticalとGetStringChars、ReleaseStringCharsの方法と非常に似ている.違いは、前者がコピーではなくjava Stringのポインタを取得する傾向にあることです.GetStringCriticalメソッドは、java Stringオブジェクトに対応する(Unicode)char配列ポインタを返すために使用され、返されるポインタはjava Stringオブジェクトを指すか、jni内のコピーを指すか、パラメータisCopyはコピーを返すために使用されます.ReleaseStringCriticalメソッドはjava Stringオブジェクトにバインドされた(Unicode)char配列ポインタを解放するために使用されます.ReleaseStringCriticalメソッドの戻り値はconstで修飾されるため、取得したchar配列は変更できません.jstring stringFromJNI(JNIEnv *env, jobject thiz, jstring s){
__android_log_print(ANDROID_LOG_INFO, "native", "stringFromJNI");
jboolean isCopy = JNI_FALSE;
jsize length = env->GetStringLength(s);
const jchar* chars = env->GetStringCritical(s, &isCopy);
__android_log_print(ANDROID_LOG_INFO, "native", "isCopy %d", isCopy);
for(int i = 0; i < length; i++){
__android_log_print(ANDROID_LOG_INFO, "native", "char %c", chars[i]);
}
env->ReleaseStringCritical(s, chars);
return s;
}