猿问

将 Java ArryList<String> 传递给 JNI C 函数并在 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 函数在控制台中打印它们。


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


Qyouu
浏览 302回答 2
2回答

UYOU

我找到了解决方案:JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj){&nbsp; &nbsp; jclass listClass = (*env)->GetObjectClass(env,obj);&nbsp; &nbsp; jmethodID sizeMethod = (*env)->(env,listClass,"size","()I");&nbsp; &nbsp; jmethodID getMethod = (*env)->GetMethodID(env,listClass,"get","(I)Ljava/lang/Object");&nbsp; &nbsp; jint size =&nbsp; (*env)->CallIntMethod(env,sizeMethod);}

胡说叔叔

Java 有类型擦除。所以在编译后的代码中List<String>就变成List了。因此,您真正要寻找的是使用 JNI 实现以下 Java 调用:jint size = list.size();for (jint i = 0; i < size; i++) {&nbsp; &nbsp; jobject elem = list.get(i);&nbsp; &nbsp; jstring str = (jstring)elem;&nbsp; &nbsp; ... print str ...}在上面的 C 代码中,list.size()andlist.get()必须替换为对GetMethodID,CallIntMethod和 的调用CallObjectMethod。可以str使用GetStringChars或检索字符串GetStringUTFLength。并且需要一些内存管理:ReleaseXXX.
随时随地看视频慕课网APP

相关分类

Java
我要回答