Android ICS 4.0 NDK NewStringUTF is crashing down the App

前端 未结 10 1956
长情又很酷
长情又很酷 2020-12-02 15:01

I have a method in JNI C/C++ which takes jstring and returns back jstring some thing like as below,

  NATIVE_CALL(jstring, method)(JNIEnv * env, jobject obj         


        
10条回答
  •  不思量自难忘°
    2020-12-02 15:42

    This is how I done this.

    1- Char Array to JByteArray.

    2- JByteArray to JString.

    3- Return jstring to java side.

    JNI Code; (.c) format

    jstring Java_com_x_y_z_methodName(JNIEnv *env, jobject thiz) {
        int size = 16;
        char r[] = {'P', 'K', 'd', 'h', 't', 'X', 'M', 'm', 'r', '1', '8', 'n', '2', 'L', '9', 'K'};
        jbyteArray array = (*env)->NewByteArray(env, size);
        (*env)->SetByteArrayRegion(env, array, 0, size, r);
        jstring strEncode = (*env)->NewStringUTF(env, "UTF-8");
        jclass cls = (*env)->FindClass(env, "java/lang/String");
        jmethodID ctor = (*env)->GetMethodID(env, cls, "", "([BLjava/lang/String;)V");
        jstring object = (jstring) (*env)->NewObject(env, cls, ctor, array, strEncode);
    
        return object;
    }
    

    Java Code;

    native String methodName();
    

    Other Approach Not Works For Me;

    I also tried return (*env)->NewStringUTF(env, r) but returns some characters that are not in the char array, at the end of the string where with the warning of JNI WARNING: input is not valid Modified UTF-8: illegal continuation byte 0x40.

    Example; PKdhtXMmr18n2L9K�ؾ�����-DL

    Edit:

    C++ version

    jstring clientStringFromStdString(JNIEnv *env,const std::string &str){
    //    return env->NewStringUTF(str.c_str());
        jbyteArray array = env->NewByteArray(str.size());
        env->SetByteArrayRegion(array, 0, str.size(), (const jbyte*)str.c_str());
        jstring strEncode = env->NewStringUTF("UTF-8");
        jclass cls = env->FindClass("java/lang/String");
        jmethodID ctor = env->GetMethodID(cls, "", "([BLjava/lang/String;)V");
        jstring object = (jstring) env->NewObject(cls, ctor, array, strEncode);
        return object;
    }
    

提交回复
热议问题