最近的实践中,有一个开源库在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
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)
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
生成的是可执行的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
两个SRC_FILES, 一个是com.example*,是用在jni跟java交互的,一个是咱自己的CPP代码,实现了调用三方库的api和基本逻辑,如果是自己运行到手机的可执行文件,只需要CPP代码,且需要加个main函数。
-THE END