将Java ArryList <string>传递给JNI C函数并在C中打印列表

时间:2018-10-17 17:48:18

标签: java c java-native-interface native

我在Java中具有以下本机方法:

public class ConsoleIO
{

    public native static void printList(List<String> list);

   ......
}

以及与JNI对应的C实现如下:

JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj)
{



}

现在,我需要将java中的字符串列表传递给printList(List list)方法,并从上述C实现中遍历它,并从C函数在控制台中将其打印出来。

我知道没有这种List类型的C表示形式,但是我需要知道如何在C中访问此字符串列表并在C本身中打印出来?

谢谢!

2 个答案:

答案 0 :(得分:0)

Java有Type Erasure。因此,List<String>在编译后的代码中变成List

因此,您真正要寻找的是使用JNI实现以下Java调用:

jint size = list.size();
for (jint i = 0; i < size; i++) {
    jobject elem = list.get(i);
    jstring str = (jstring)elem;
    ... print str ...
}

在上面的C代码中,list.size()list.get()必须替换为GetMethodIDCallIntMethodCallObjectMethod的调用。可以使用strGetStringCharsGetStringUTFLength检索字符串。并且需要一些内存管理:ReleaseXXX

答案 1 :(得分:0)

我找到了解决方案:

JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj)
{

    jclass listClass = (*env)->GetObjectClass(env,obj);

    jmethodID sizeMethod = (*env)->(env,listClass,"size","()I");
    jmethodID getMethod = (*env)->GetMethodID(env,listClass,"get","(I)Ljava/lang/Object");

    jint size =  (*env)->CallIntMethod(env,sizeMethod);


}