为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2021-11-24 14:47:19
我在 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 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

我找到了解决方案:


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



}


查看完整回答
反对 回复 2021-11-24
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

Java 有类型擦除。所以在编译后的代码中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()andlist.get()必须替换为对GetMethodID,CallIntMethod和 的调用CallObjectMethod。可以str使用GetStringChars或检索字符串GetStringUTFLength。并且需要一些内存管理:ReleaseXXX.


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 301 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信