Android NDK開發常見錯誤
JNI 呼叫時,一直報 No implementation found for native
有一個可能是,如果呼叫的是C++的程式碼,必須加extern "C"
【轉】 jni 呼叫c和c++的區別.
1、JNIEnv *env引數的使用
所有JNI介面的第一個引數是JNIEnv *env, 在C中,使用方法是
(*env)->NewStringUTF(env, "Hello from JNI!");
但在C++中,其呼叫方法是
env->NewStringUTF("Hello from JNI!");
為什麼有這種區別呢,看看jni.h中關於JNIEnv的定義就可以知道了:
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
#else
typedef const struct JNINativeInterface* JNIEnv;
#endif
可以看到,對於C和C++,定義有所不同,主要原因是C不支援類,所以採用了一種變通的方法。
2、介面找不到
在Java中呼叫JNI介面時,出現異常,察看日誌,發現有如下錯誤:
WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V
檢查了幾遍程式碼,Cpp中確實定義了這個介面,而且仔細對照了Java的包名、類名,確實沒有錯誤,那為什麼會出現這種問題呢。後來突然想到,JNI介面 都是以C的方式定義的,現在使用C++實現,函式定義前是否需要加上extern "C"呢?為此定義了一個頭檔案,在CPP檔案中include該標頭檔案,標頭檔案加上如下程式碼片斷:
#ifdef __cplusplus
extern "C" {
#endif
#endif
...
#ifdef __cplusplus
}
再次嘗試,呼叫成功!