Android NDK开发method GetStringUTFChars’could not be resolved
Android NDK開發method GetStringUTFChars’could not be resolved
?
圖1
最近用到android的ndk,但在eclipse中提示method GetStringUTFChars’could not beresolved這樣的錯誤,但奇怪的是我也增加了圖1的代碼到android-ndk-r10b\samples\hello-jni\jni\hello-jni.c中卻沒有這個編譯錯誤,我分別右擊編譯出錯的AppCenter和hello-jni工程,發現AppCenter工程屬性多了C/C++ Build和C/C++ General,如下圖:
圖2
解決辦法是右鍵工程 property->C/C++ General->CodeAnalysis—>配置當前工程(或者workspace)->使 method cannot be resolved? 不選中(即此項不進行報錯 )
?
這樣就可以編譯成功了,但我在做一些測試又改回編譯OK的狀態,卻有另一個編譯錯誤:
no matchingfunction for call to '_JNIEnv::GetStringUTFChars(JNIEnv*&, _jstring*&,
?????? ?jboolean*)'
改為下面的代碼就可以了
const char*path_utf = env->GetStringUTFChars(path, &iscopy);
?
可以為什么在anroid NDK中自帶的例子沒有這個問題呢?因為Android NDK帶的jni例子都是使用C定義JNI接口,但是在項目中,因為Native代碼是用C++編寫的。
JNIEnv *env參數的使用有下面的差別:
所有JNI接口的第一個參數是JNIEnv *env, 在C中,使用方法是
(*env)->NewStringUTF(env,"Hello from JNI!");
但在C++中,其調用方法是
env->NewStringUTF("Hellofrom JNI!");
?
我們來看jni.h的相關內容:
#if defined(__cplusplus)
typedef _JNIEnvJNIEnv;
typedef _JavaVMJavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif
可以看到,對于C和C++,定義有所不同,主要原因是C不支持類,所以采用了一種變通的方法,下面給出JNIEnv分別對應C和C++的定義:
(1)??C
/* JNI spec says this returns const jbyte*, but that'sinconsistent */
const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);
?
(2)??C++
struct _JNIEnv {
……….
const char*GetStringUTFChars(jstring string, jboolean* isCopy)
{returnfunctions->GetStringUTFChars(this, string, isCopy); }
………………
}
?
參考鏈接:
Eclipse Ndk開發中的Method 'NewStringUTF' could not be resolved問題
http://www.android100.org/html/201308/09/3935.html
?
jni 調用c和c++的區別.
http://blog.csdn.net/kandyer/article/details/9097203
?
總結
以上是生活随笔為你收集整理的Android NDK开发method GetStringUTFChars’could not be resolved的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android+Eclipse修改包路径
- 下一篇: 在android C/C++ nativ