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

程序猿 阅读:18 2024-10-01 17:34:08 评论:0

据我所知,我无法从 C++ 调用将从 Java 字符串数组返回的方法,因此唯一的解决方案是循环调用方法,它将逐个返回数组元素,但我如何将它们存储在 C++ 中数组?

在 Java 中我有方法:

public static String getData(int index){ return arry[index]; } 

在 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); 
} 

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

请您参考如下方法:

假设您发布的 C++ 代码片段是完整的,您将遇到访问冲突,因为您需要在将值复制到其中之前分配 args[i] - args[i ] = new char[ len + 1 ] 就可以了。

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

public static String[] getData() { return array; } 

然后在 native 端你应该能够做这样的事情:

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 ); 
} 

我没有尝试编译上面的代码片段,所以可能会出现一两个错误,但它应该是一个不错的起点。我在代码中保留了一个 char* 数组和 native 字符串,因此在某些时候代码将不得不对数组的每个成员和数组本身调用 delete[]。根据提供的字符串的使用方式,使用 std::vectorstd::string 进行内存管理最终可能会更简单。


标签:java
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号