第一次在Android NDK的C++代碼中調用第三方so檔案時吃了點虧, 以為只用把.so檔案放到libs/armeabi目錄下即可, 沒想到一ndk-build, 該so就被刪除了, 報告連結錯誤. 通過瞭解, 發現NDK下調用.so時需要對其作PREBUILT處理, 步驟如下:
1.在project/jni目錄下建立prebuilt子目錄(目錄名可自訂).2.將第三方.so放到prebuilt中,並建立Android.mk, 內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := libxxx.so
include $(PREBUILT_SHARED_LIBRARY)
3.在project/jni/Android.mk中加入
LOCAL_SHARED_LIBRARIES := xxx
4.在project/jni/android.mk的最後加入
include $(LOCAL_PATH)/prebuilt/Android.mk
5.運行cygwin, 到project目錄下, 運行$NDK/ndk-build 靜態庫的引用
前兩天想用jni方式調用一些現成代碼,於是使用NDK編譯項目,Android.mk檔案如下:
view plainprint?
- LOCAL_PATH := $(call my-dir)
-
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := my_jni
- LOCAL_SRC_FILES := my_jni.c
-
-
- LOCAL_STATIC_LIBRARIES := libstatic
-
- LOCAL_LDLIBS := -llog
-
- include $(BUILD_SHARED_LIBRARY)
libstatic.a是我要調用的第三方靜態庫。
但是出現了問題,提示一直找不到靜態庫中的函數,如下提示:
view plainprint?
- D:/WJR-WorkPlace/WorkSpace/Android/jni/my_jni.c:172: undefined reference to `_Destroy'
其中_Destroy是第三方靜態庫提供的函數。
找了很多資料沒能解決問題,最終在同事的協助下解決問題了,原因是靜態庫連結不對,將android.mk改為
view plainprint?
- LOCAL_PATH := $(call my-dir)
-
- include $(CLEAR_VARS)
- LOCAL_MODULE := static
- LOCAL_SRC_FILES := libstatic.a
- include $(PREBUILT_STATIC_LIBRARY)
-
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := my_jni
- LOCAL_SRC_FILES := my_jni.c
-
- LOCAL_STATIC_LIBRARIES := static
-
- LOCAL_LDLIBS := -llog
-
- include $(BUILD_SHARED_LIBRARY)