将 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()
必须替换为 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);
}
我在 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()
必须替换为 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);
}