有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将字符串列表从Java传递到C

我需要通过JNI将字符串列表从Java传递到C。 我的Java程序传递一个列表参数,C程序接受一个列表

下面是我尝试的代码

JNIEXPORT jobject JNICALL Java_jni_CallJNIfunction(JNIEnv *env,  
                                                         jobjectArray jParameters){

    list<const char*> cParameters;

    jsize stringCount = env->GetArrayLength(jParameters);

    for (int i=0; i<stringCount; i++) {
       jstring arrElement = (jstring) (env->GetObjectArrayElement(jParameters, i));
       const char* nativeElement = env->GetStringUTFChars( arrElement, NULL);

       cParameters.push_back(nativeElement);
       env->ReleaseStringUTFChars(arrElement, nativeElement);
    }

    CallCfunction(cParameters);

}

但我的JVM在GetStringUTFChars()行崩溃。 这个程序有什么问题


共 (2) 个答案

  1. # 1 楼答案

    简单C函数的第一个答案是:

    char **GetStringsfromJniStringArray(JNIEnv *env, jobjectArray stringArray) {
        size_t stringCount = (size_t)(*env)->GetArrayLength(env, stringArray);
        char **Strings=calloc(stringCount, sizeof(char*));
        int i = 0;
        for(i = 0; i < (int)stringCount; ++i )
        {
            jstring jniString = (jstring) (*env)->GetObjectArrayElement(env, stringArray, i);
            const char *TempString = (*env)->GetStringUTFChars(env, jniString, NULL);
            Strings[i] = calloc(strlen(TempString)+1, sizeof(char));
            strcpy(Strings[i], TempString);
            (*env)->ReleaseStringUTFChars(env, jniString, TempString);
        }
        return Strings;
    }
    
  2. # 2 楼答案

    你会:

    const char* nativeElement = env->GetStringUTFChars( arrElement, NULL);
    cParameters.push_back( nativeElement );
    env->ReleaseStringUTFChars(arrElement, nativeElement);
    

    您将存储的字符串释放到列表中,因此列表中包含大量错误指针

    您必须将字符串复制到一个长时间分配的空间中,您可以选择std::string、char*+malloc,或者使用它并忘记它的方法

    第三种解决方案的解释:

    for( int i = 0; i < stringCount; ++i )
    {
       jstring arrElement = (jstring) (env->GetObjectArrayElement(jParameters, i));
       const char* nativeElement = env->GetStringUTFChars( arrElement, NULL);
       CallCfunction( nativeElement ); // modified to process an item not a list<
       env->ReleaseStringUTFChars(arrElement, nativeElement);
    }