既存のC++コードの静的ライブラリを使用するアンドロイドアプリケーションを構築しようとしています。しかし、私は物事を構築することができない、ここに私がこれまでに撮影したステップはここにあります..Android NDK開発用に事前構築された静的ライブラリを使用する
私はndk-r5bを持っており、ndk/docs/STANDALINE-TOOLCHAIN.htmlに従ってスタンドアロンツールチェーンを構築しました。私はスタンドアロンのツールチェインコンパイラ(arm-linux-androideabi-g ++)をg ++ではなく、必要な静的ライブラリをコンパイルするMakefileのCXXフラグに使用しました。これはエラーなしでコンパイルされ、3つの静的ライブラリが生成されます。ここ は、ビルド済みのライブラリを構築するために使用されるフラグのいくつかのコードスニペットです:ここで
CXX = arm-linux-androideabi-g++
SYSTEM_LIBS = -lstdc++ -lm
INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/
をコンパイルするときにメイクファイルから生成されたサンプルラインです:
arm-linux-androideabi-g++ -c -DTIME_SIM -I./include -I/home/greg/dev/Android/android-ndk-r5b/platforms/android-8/arch-arm/usr/include/ -fpic -ggdb3 -SimTime.C -o SimTime.o
次の私が構築しますアプリAndroid.mkのために、以下のものを使用してNDKビルドを使用して:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := engine
LOCAL_SRC_FILES := ../libs/libEngine.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := shmem
LOCAL_SRC_FILES := ../libs/libShMem.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := util
LOCAL_SRC_FILES := ../libs/libUtil.a
include $(PREBUILT_STATIC_LIBRARY)
# build server as a shared library
include $(CLEAR_VARS)
LOCAL_MODULE := libServer
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include
LOCAL_SRC_FILES := \
Server.C \
Router.C \
RouterMsgs.C \
Federation.C \
cripName.C \
ver.C \
JNIWrapper.cpp
LOCAL_STATIC_LIBRARIES := engine shmem util
include $(BUILD_SHARED_LIBRARY)
ビルド済みのライブラリは罰金アンドロに与えられたスタンドアロンのツールチェーンコンパイラを使用してコンパイルid ndk。しかし、共有ライブラリをndk-buildを使ってビルドされたライブラリにリンクするときは、ostreamへの未解決の参照がたくさんあります。 exampeについて:
/home/android/obj/local/armeabi/libShMem.a(SubscriptionItem.o): In function `SUBSCRIPTION_ITEM::Print(std::basic_ostream<char, std::char_traits<char> >&)':/home/src/comm/SubscriptionItem.C:97: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
私はいくつかの重要なフラグを見つからないか、私は、スタンドアロンのコンパイラを使ってコンパイルしていますが、私はこれを見つけるように見えるカントとして、この問題に任意のヘルプや洞察力をいただければ幸いときに正しい何かをしておりませんと仮定しますgoogleやアンドロイドのndk docsのいずれかの答え。ありがとう!
これは良い考えではありません。 libstdC++に依存する完全に静的にリンクされたライブラリをビルドすると、それらの関数のコピーがライブラリに含まれます。しかし、電話機でライブラリをロードすると、zygoteから分岐したときにアプリケーションが継承したlibstdC++の共有マッピングがすでにあるプロセスにロードされます。これは最低でも無駄です。ライブラリが満足していない依存関係を持つようにするには、ビルドフラグを使用する方が良いでしょうか? –