1. 程式人生 > >Android NDK開發常見錯誤

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

}

再次嘗試,呼叫成功!