我在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本身中打印出来?
谢谢!
答案 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()
必须替换为GetMethodID
,CallIntMethod
和CallObjectMethod
的调用。可以使用str
或GetStringChars
从GetStringUTFLength
检索字符串。并且需要一些内存管理: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);
}