JNI文字列操作

6848 ワード

  • NewString
    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);
    }
    
  • GetStringLength
    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;
    }
    
  • を返します.
  • GetStringCharsとReleaseStringChars
    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;
    }
    
  • NewString(Unicode)
    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());
    }
    
  • GetStringUTFLength
    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;
    }
    
  • GetStringUTFcharsとReleaseStringUTFchars
    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;
    }
    
  • GetStringRegion
    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);
    }
    
  • GetStringUTFRegion
    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);
    }
    
  • GetStringCriticalは、ReleaseStringCritical
    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;
    }