如何从C++调用Java方法(java返回String [])?

K-O*_*K-O 3 arrays string java-native-interface

据我所知,我不能从C++中调用将从Java字符串数组返回的方法,所以只有这个解决方案是循环调用方法,它将返回数组元素,但是如何将它们存储在C++数组中呢?

在Java中我有方法:

public static String getData(int index){ return arry[index]; }
Run Code Online (Sandbox Code Playgroud)

在C++中:

char * args[10];
for (int i = 0; i < arrayLength; i ++) {
    jmethodID mid = env->GetStaticMethodID(INF.cls_JSox, "getData",(I)Ljava/lang/String;");
    jobject result = env->CallStaticObjectMethod(cls, mid, num, i);
    const char *nativeString = env->GetStringUTFChars( (jstring) result, 0);
    const size_t len = strlen(nativeString);
    cout << "copying... \n";
    strncpy(args[i], nativeString, len);
    env->ReleaseStringUTFChars( (jstring)result, nativeString);
}
Run Code Online (Sandbox Code Playgroud)

但是当i= 1时,我在Java中遇到内存冲突错误.如何正确地将接收到的字符串中的数据复制到char * args[10]?从Java传递的每个字符串的长度大约是3-5个字符.

rus*_*_uk 6

假设您发布的C++代码段已完成,您将获得访问冲突,因为您需要args[i]在将值复制到其中之前进行分配- args[i] = new char[ len + 1 ]这样做.

您实际上可以从C++调用返回Java字符串数组的方法,假设您的方法是:

public static String[] getData() { return array; }
Run Code Online (Sandbox Code Playgroud)

然后在本机方面你应该能够做到这样的事情:

jmethodID method = env->GetStaticMethodID( cls, "getData", "()[Ljava/lang/String;" );
jarray    data   = (jarray) env->CallStaticObjectMethod( cls, method );

// assumption: the result of getData() is never null
jsize const length = env->GetArrayLength( data );

// assumption: the String[] is always of length > 0
char** args = new char*[ length ];

for( jsize index(0); index < length; ++index )
{
    jstring element = (jstring) env->GetObjectArrayElement( data, index );

    // assumption: there are no null strings in the array
    char  const* nativeString = env->GetStringUTFChars( element, 0 );
    jsize const  nativeLength = strlen( nativeString );

    args[index] = new char[ nativeLength + 1 ];
    strncpy( args[index], nativeString, nativeLength );

    env->ReleaseStringUTFChars( element, nativeString );
    env->DeleteLocalRef( element );
}
Run Code Online (Sandbox Code Playgroud)

我没有尝试编译上面的代码段,所以可能有一两个错误,但它应该是一个好的起点.我使用char*数组和本地字符串留下了代码,所以在某些时候代码必须调用delete[]数组的每个成员和数组本身.根据提供的字符串的使用方式std::vector,它最终可能最终更简单地使用和std::string用于内存管理.