使用JNI将字符串数组从java传递给C.

时间:2011-05-12 00:51:06

标签: java c java-native-interface

我有一个像{"myname","yourname","hisname"}这样的字符串数组,我正在尝试使用 JNI 将此数组发送到 C 。我找不到任何明确的解决方案。我试图把这个字符串作为chararray,但没有成功。

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:80)

你可以编写一个简单的函数,它接受一个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.
    }
}

答案 1 :(得分:9)

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

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

答案 2 :(得分:1)

可以通过以下方式完成:

(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
}

答案 3 :(得分:0)

请记住使用

env->GetArrayLength(stringArray);