第一次在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文件如下:
- 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)
但是出现了问题,提示一直找不到静态库中的函数,如下提示:
- D:/WJR-WorkPlace/WorkSpace/Android/jni/my_jni.c:172:
undefined reference to `_Destroy'
找了很多资料没能解决问题,最终在同事的帮助下解决问题了,原因是静态库链接不对,将android.mk改为
- 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)