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

Passing Java ArryList<String> to JNI C function and print the list in C

我在 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 函数在控制台中打印它们。

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

提前致谢!

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 的调用。可以使用 GetStringCharsGetStringUTFLengthstr 检索字符串。并且需要一些内存管理:ReleaseXXX.

我找到了解决方案:

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


}