java - 如何将 void ** 从 JNI C 代码传递给 C 库?

标签 java c java-native-interface jnienv

1) image_api.h 定义了以下方法 - int process_image(const char *svgData, void **mapData);

2) 现在我需要调用此方法并将正确的值传递给从 image_api.so 文件加载的 process_image

-- 在 JNI C 包装器代码中创建 void** 实例的正确方法是什么?

3)

JNIEXPORT jint JNICALL Java_JNITest_process_image(JNIEnv *env, jstring svgData, jobject mapData, jint status) {

    const char *str;
    str = (*env)->GetStringUTFChars(env, svgData, NULL);
    **status = process_image(str,  (void**)&mapData);** 

return status;
}

////////////

我在调用 process_image 时遇到 UnsatisfiedLinkError 因为方法签名不匹配

最佳答案

根据更新,如果没有 Java,代码将如下所示:

void * mapData; 
int status = process_image(svgData, &mapData);
...
int result = process_MapData(mapData);

现在我们想从单独的 native Java 方法中调用 process_image 和 process_MapData:

processImage(svgData, ?);
...
int result = processMapData(?);

注意Java没有指针,所以我们必须想办法包装void*。幸运的是,这种指针的大小是 64 位或更少。 Java 有一个标准的数据类型 long,它的大小恰到好处。

所以,我们可以使用

native static long processImage(String svgData);
native static int porocessMapData(long mapPtr);
...
long mapPtr = processImage(svgData);
...
int result = processMapData(mapPtr);

这是C端:

JNIEXPORT jlong JNICALL Java_JNITest_processImage(JNIEnv *env, jclass clazz, jstring svgData) {

    char *str = (*env)->GetStringUTFChars(env, svgData, NULL);
    void* mapData;
    process_image(str, &mapData);
    (*env)->ReleaseStringUTFChars(env, svgData, str);
    return (jlong)mapData;
}

JNIEXPORT jint JNICALL Java_JNITest_processMapData(JNIEnv *env, jlcass clazz, jlong mapData) {
    return process_mapData((void *)mapData);
}

关于java - 如何将 void ** 从 JNI C 代码传递给 C 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45620561/

相关文章:

c - 使用大括号将数据分配给数组

c - select() 在非阻塞 AF_PACKET 套接字上立即返回 0,忽略 timeval

java - 在 java 中使用 CPP 枚举常量

java - 如何通过 JNI 的函数调用接收 double 组?

java - 让三个按钮中只有一个按钮可以选择,如果我再次点击它可以回到原来的状态

java - 访问 .jar 之外的属性文件?

java - java中多任务的任务调度?

java - 有没有与 Android 的 Xcode clang 静态分析器相当或相似的东西?

c - 用于删除子文件夹中某些文件类型的递归或迭代

java - 如何从共享库调用函数