gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:10 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com