天天看點

NDK編譯錯誤總結

  1. Permission denied解決方案:先切換到/cygwin/工作目錄/obj/local/armeabi/ 下,然後

    Chmod –c 777 ./ ,再切換到jni目錄下build.不行換:chmod -Rv 777 ./

  2. 如果庫沒有放進對應android項目的libs裡,而使用了System.loadLibrary(“xx”);會報connot find library return null;
  3. 回調函數的參數如果是byte[],那麼在jni層傳遞的應該是jbyteArray,而不是jcharArray,否則偶爾報錯:~Channel is unrecoverably broken and will be disposed!
  4. 加載庫的時候一定要注意加載順序,可能會引發初始化AvcComm失敗,或者Shutton Down JavaVM
  5. jType類如何new出來後并沒有回調回去,就是沒有使用它就将它釋放了會報空指針。

    eg:Fatal signal 11 (SIGSEGV) at 0x00000074 (code=1)

  6. 要用到某個動态庫的某個方法,必須要加載(System.loadLibrary)這個庫,如果這個動态庫和Java層有 native方法的關聯,那麼加載這個庫的時候必須實作Java層的native方法(注意包名類名),如果沒有加載這個動态庫,會報異常(UnsatisfiedLinkError: Cannot load library),還有,這個動态庫必需加載(loadLibrary)。 而靜态庫不需要加載,可以讓動态庫與本地方法關聯,然後動态庫調用靜态庫裡的方法,這樣Java層加載庫時并不需要這個靜态庫,隻需要加載那個動态庫,調用那個動态庫裡的native方法。
  7. LOCAL_LDLIBS += -L(LOCAL_PATH)/../lib_so) -lNDK_03

    注解:找到目前mkfile檔案的上層目錄下的lib_so檔案夾下的NDK_03庫,将這個庫包含進去

  8. jni中包名帶有“.”,例如:/data/data/com.duicky/luyao.txt”是正确的,而不是/data/data/com/duicky/luyao.txt
  9. LOCAL_SRC_FILES中寫源檔案名稱的時候,如果最後面的’\’後面有空格(看不見),編譯報錯:recipe commences before first target. 停止
  10. 如果找不到string,那麼可以在android.mk裡添加

    LOCAL_LDLIBS := -lC

    LOCAL_C_INCLUDES += $(NDK_PATH)/sources/cxx-stl/stlport/stlport

  11. NDK編譯時找不到map頭檔案:建立Application.mk,在裡面加入NDK_STL_INC 的設定。
APP_BUILD_SCRIPT := $(call my-dir)/Android.mk
APP_MODULES := shortcut_key_server 

NDK_PATH := /cygdrive/d/android-ndk-r8d/ndk-build
NDK_STL_INC := $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/include

APP_OPTIM        := release 
APP_CFLAGS       += -O3
APP_STL := stlport_static

APP_PLATFORM := android-9 
           

13.編譯時報錯:找不到NDK裡面公共基礎庫的方法。比如:

/stl/_string.c:600:error:undefined reference to ‘std::__stl_throw_length_error(char const*)’

需要修改Application.mk中的NDK_STL_INC和APP_STL。有兩種:

①:NDK_STL_INC := $(NDK_PATH)/sources/cxx-stl/stlport/stlport
          APP_STL := stlport_static

②:NDK_STL_INC := $(NDK_PATH)/sources/cxx-stl/gnu-libstdc++/4.6/include
          APP_STL := gnustl_shared
           

14.編譯時連結靜态庫後,運作報錯,報靜态庫的錯誤,那就LOCAL_STATIC_LIBS,将靜态庫包含編譯進去,不連結。

15. 臨界區:XAutoLock l(m_secCmdBuffer);的起始為“{”,結束為”}”

繼續閱讀