2015-02-24 46 views
1

我做了兩個測試項目,都是使用JNI的android應用程序。使用C++時找不到本地方法

對於第一個我沒有使用Android工具/添加本地支持。本地方法使用JNI的C語法在.c文件中定義,並且工作正常,該方法被成功找到並調用。

在第二個項目中,我添加了本機支持,並使用JNI的C++語法將本機代碼寫入了一個.cpp文件。在這種情況下,它不起作用,調用它時找不到本地方法。

我已經檢查了方法的名稱1000次,它的拼寫完美。該項目編譯正確,.so庫也加載成功,但該方法無法找到。

這裏是我的cpp文件:

#include <jni.h> 

JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(JNIEnv * env, jobject jobj, jstring oStr) 
{ 
    // some stuff 
} 

可能這是因爲什麼?爲什麼在使用C++的時候它不起作用,而在使用C的時候卻起作用呢?我可以在這裏錯過什麼? 謝謝。

+0

我想我找到了問題。我必須轉發在.cpp文件中聲明該函數爲extern C. – Virus721 2015-02-24 08:57:02

+0

使用'javah'生成所需的頭文件。然後,你將不會遇到簽名問題。 – jww 2015-05-01 19:26:09

回答

2
extern "C" { 
    JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(...) 
    { 
     // some stuff 
    } 
} 
0

內部,C++編譯器'撕裂'被告知的C++功能(例如,打字目的)他們所需要的名字,並給定函數應該被稱爲一個C函數(因此,沒有名字被破壞)。

有關在共享庫中使用CPP的更多信息,請參閱here

1
#include <jni.h> 

您還必須#include生成的.h文件。使功能extern "C",並提供檢查,你有正確的名稱。

0

當我的Java類本地函數聲明中指定的參數類型與我在C++方法聲明中聲明的類型不匹配時,遇到此問題。 Javah將生成看起來是.h文件中正確的條目,但是C++編譯器總是破壞了入口點名稱。它沒有改寫我寫的其他方法的名字。

在我的情況下,我在我的Java方法聲明中傳入一個long [],但在我的C++方法聲明中使用了jobjectarray。將C++聲明更改爲jlong​​array解決了該問題,並且該函數不再受到損壞。

相關問題