传递Java ArryList<;字符串>;调用JNI C函数并用C打印列表

传递Java ArryList<;字符串>;调用JNI C函数并用C打印列表,java,c,java-native-interface,native,Java,C,Java Native Interface,Native,我有以下Java本机方法: public class ConsoleIO { public native static void printList(List<String> list); ...... } 现在,我需要将一个字符串列表从java传递到printList(list list)方法,并从上面的C实现中循环,然后从C函数在控制台中打印它们 我知道这个列表类型没有C表示,但我需要知道如何用C访问这个字符串列表并用C本身打印出来 提前谢谢 Java已经成功

我有以下Java本机方法:

public class ConsoleIO
{

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

   ......
}
现在,我需要将一个字符串列表从java传递到printList(list list)方法,并从上面的C实现中循环,然后从C函数在控制台中打印它们

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

提前谢谢

Java已经成功了。因此,
List
在编译代码中变为
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 ...
}
jint size=list.size();
对于(jint i=0;i

在上面的C代码中,
list.size()
list.get()
必须替换为调用
GetMethodID
CallIntMethod
CallObjectMethod
。可以使用
GetStringChars
GetStringUTFLength
str
检索字符串。需要一些内存管理:
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);


}

这里有一个@Blake,我已经看过了,但是没有任何访问泛型类型列表的例子。。。无论如何谢谢你!啊,我知道你的问题是关于将
List
参数从一个地方传递到另一个地方的。我不知道如何具体使用
列表
;通过数组代理它可能更容易。请参阅指南。将所需的文本输出格式化为以“\0”结尾的字符串、使用本机字符编码获取字节、将字节数组传递给JNI并将其视为本机字符串要容易得多。提示:如果您的本机方法有适当的公开签名,请考虑将其转换为java方法,该方法在私有方法的前处理和后处理中更容易在JNI中实现。谢谢,但我真的不知道如何做,因为我是JNI的初学者。
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);


}