使用JNI将字符串数组从Java传递到C

35

我有一个字符串数组,如{"myname","yourname","hisname"},我想使用JNI将它发送到C。我找不到任何清晰的解决方案。我尝试将这个字符串作为一个chararray,但没有成功。

是否有办法实现这个目标?

4个回答

87
你可以编写一个简单的函数,它接受一个jobjectArray对象,将其强制转换为jstring,然后调用GetStringUTFChars函数。
代码示例如下:
void MyJNIFunction(JNIEnv *env, jobject object, jobjectArray stringArray) {

    int stringCount = env->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
        jstring string = (jstring) (env->GetObjectArrayElement(stringArray, i));
        const char *rawString = env->GetStringUTFChars(string, 0);
        // Don't forget to call `ReleaseStringUTFChars` when you're done.
    }
}

需要输入jobject object吗? - user1893354
1
我需要在使用GetObjectArrayElement返回的临时jstring对象上调用DeleteLocalRef吗? - Violet Giraffe

10

是的,有一种方法。您可以从Java端将String[]传递到本地方法中,这将作为jobjectArray传递到C / C ++端。 然后,您将使用GetObjectArrayElement()在给定索引处获取jstring,然后使用GetStringUTFChars()GetStringChars()获取底层字符串数据的C / C ++指针。

如果您不知道,JNI Book是一个有价值的参考资料。


1
谢谢参考。我已经阅读了它。我解决了发送字符串到 C 端的问题。我尝试练习时发送了数组并成功了。感谢您的帮助。有两个正确的答案,如果您不介意的话,我想给 8ball 打赏声望值... - masay
6
"JNI Book" 的链接已经失效。 - Markus Weninger

0

可以按照以下方式完成:

(JNIEnv *env, jobject object, jobjectArray prdctini)
    {
        const char *param[20];
        jsize stringCount = (*env).GetArrayLength(prdctini);

          for (int i=0; i<stringCount; i++) {
                  jstring string = (jstring) (*env).GetObjectArrayElement( prdctini, i);
                  param[i] = (*env).GetStringUTFChars( string, NULL);
          }
          cout<<"U_Id="<<param[0]<<endl;
          cout<<"aggregation="<<param[1]<<endl
}

9
ReleaseStringUTFChars 如何? - Dmitry Zaytsev

0

记得使用

env->GetArrayLength(stringArray);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接