NDK build 引入第三方动态库

最近的实践中,有一个开源库在linux上运行良好,但是想把它打包到android平台,需要在ndk编译使用

这个开源库,是有源码的,在linux上编译出so库,在ndk编译有错误,具体错误码,记不清楚了,但是很明显是linux平台的gcc/g++编译的,而不是ndk的交叉编译环境出来的so库,所以ndk编译不成功。那么。。。如何解决的


1. ndk交叉编译源码第三方库

如果别人给的动态库是linux环境编译的,看来还真不好直接用在Android环境中。需要Android平台的编译出来的so库

- 建立jni目录,开源代码全部拷贝进jni。示例的Android.mk 是带了Opencv-android SDK

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ../../../sdk/native/jni/OpenCV.mk

MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)

LOCAL_C_INCLUDES += $(LOCAL_PATH) \
                    $(JNI_H_INCLUDE)

LOCAL_LDLIBS     += -llog -ldl -pthread -lm
LOCAL_SHARED_LIBRARIES += \
                        libandroid \


LOCAL_MODULE := asm
#LOCAL_CFLAGS += -pie -fPIE
#LOCAL_LDFLAGS += -pie -fPIE
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)
 - Application.mk

 因为要用到STL,Application.mk 需要配置STL

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_CFLAGS += -Wno-error=format-security
APP_ABI := armeabi-v7a

现在,我们开源库的android动态库编译出来了


2. 拷贝android.so库到真实项目的jni/prebuild 下

这个so库,需要在 主Android.mk 中重新prebuilt一下,所以暂时让它待在prebuild目录下,在这个目录下同时需要建立一个Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := asm_prebuild
LOCAL_SRC_FILES := libasm.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/stasm_lib.h
include $(PREBUILT_SHARED_LIBRARY)

重新建立一个asm_prebuild 库,将会用在最终项目的jni/Android.mk 里,这一步不需要ndk-build, 会在主Android.mk一起编译


3.  主Android.mk

这个是在最终项目的jni下,带自己的代码和Android.mk & Application.mk

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ../../../sdk/native/jni/OpenCV.mk


LOCAL_SRC_FILES  := \
                    com_example_camerademo_JniClient.c \
                    delu.cpp

LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc \
                    $(JNI_H_INCLUDE)

LOCAL_LDLIBS     += -llog -ldl -pthread -lm
LOCAL_SHARED_LIBRARIES += \
                        libandroid \
                        asm_prebuild


LOCAL_MODULE := delu
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)

include $(LOCAL_PATH)/prebuild/Android.mk

带了Opencv的android SDK,三方库在LOCAL_SHARED_LIBRARIES里面, -pie也带了,不带在android shell里不能直接运行(生成的BUILD_EXECUTABLE)

生成的是可执行的delu,adb push 到手里里,直接运行, 注意最后一行, 是顺带了prebuild的第三方库


Appliaction.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_CFLAGS += -Wno-error=format-security
APP_ABI := armeabi-v7a
#APP_PLATFORM := android-8

这个Application.mk跟刚才那个一样,主要是带STL和APP_ABI


两个SRC_FILES, 一个是com.example*,是用在jni跟java交互的,一个是咱自己的CPP代码,实现了调用三方库的api和基本逻辑,如果是自己运行到手机的可执行文件,只需要CPP代码,且需要加个main函数。


-THE END

你可能感兴趣的:(Android)