NDK buildサードパーティ製ダイナミックライブラリの導入

3230 ワード

最近の実践では、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を使うから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_EXECUTTABLE)
生成されたのは実行可能な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

このアプリmkはさっきと同じで、主にSTLとAPPを持っています.ABI
2つのSRC_FILES、一つはcom.example*は、jniでjavaと対話するために使用され、1つは私たちのCPPコードで、3つのライブラリを呼び出すapiと基本的な論理を実現し、自分が携帯電話に実行できる実行可能なファイルであれば、CPPコードだけでなく、main関数を追加する必要があります.
-THE END