2017-08-10 112 views
0

1)image_api.h定義了以下方法 - int process_image(const char * svgData,void ** mapData);如何將void **傳遞給來自JNI C代碼的C庫?

2)現在我需要調用此方法,並傳遞正確的價值觀,以process_image是從image_api.so文件

加載 - 請告訴我在JNI C包裝代碼中創建無效**的情況下正確的做法?

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

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

我面對UnsatisfiedLinkError在調用process_image方法簽名不匹配

+0

'mapData'的類型是'jobject'的。這是一個指針嗎? 'process-image'想要一個指向指針的指針。你正在傳遞一個指向'jobject'的指針。 – lurker

+0

'Java_JNITest_process_image'看起來不像一個有效的方法引用...除非你正在運行'JNITest'包名中的所有東西。但即使如此 - 不應該像'Java_JNITest_JNITest_process_image'這樣的東西(假如你的類也被命名爲'JNITest')?方法聲明中的類名稱在哪裏? – Shark

回答

1

基於更新,沒有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); 
} 
+0

非常感謝這樣有用的解釋。 –

1

在你的代碼

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; 
} 
+0

其第三方庫,我沒有獲得源代碼,....我只知道,如果我可以通過[void ** mapData],那麼內部c代碼將初始化mapData,存儲一些值,然後我必須調用另一個函數,然後我需要傳遞mapData ..... –

+0

你至少知道mapData是什麼嗎? void *是一種將任何東西作爲指針傳遞的方法。但是,在內部,這可能是一些結構,緩衝區,數組,無論它是什麼。這個其他函數需要什麼參數?它是無效的**嗎?我假設你有頭文件。你能在那裏找到什麼?我知道,這是很多問題和猜測。 – mko

相關問題