[英]How to pass void ** to a C library from JNI C code?
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
在你的代碼中
JNIEXPORT jint JNICALL
Java_JNITest_process_image(JNIEnv *env,
jstring svgData,
jobject mapData, // this is some Java object, you need to access it
// take a look here:
// http://jnicookbook.owsiak.org/recipe-No-020/
jint status // you don't need that, and you can't return value
// like this in JNI
) {
const char *str;
str = (*env)->GetStringUTFChars(env, svgData, NULL);
// Question is ... what exactly process_image does?
// without any additional knowledge about process_image
// it is hard to guess what goes here
int status = process_image(str, &pointer_to_some_memory_region );
return status;
}
基於更新,如果沒有Java,代碼將如下所示:
void * mapData;
int status = process_image(svgData, &mapData);
...
int result = process_MapData(mapData);
現在,我們要從單獨的本機Java方法中調用process_image和process_MapData:
processImage(svgData, ?);
...
int result = processMapData(?);
請注意,Java沒有指針,因此我們必須找到某種包裝void*
。 幸運的是,此類指針的大小為64位或更小。 Java具有長為適當大小的標准數據類型。
因此,我們可以使用
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.