2011-06-22 10 views
8

既存の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のいずれかの答え。ありがとう!

+0

これは良い考えではありません。 libstdC++に依存する完全に静的にリンクされたライブラリをビルドすると、それらの関数のコピーがライブラリに含まれます。しかし、電話機でライブラリをロードすると、zygoteから分岐したときにアプリケーションが継承したlibstdC++の共有マッピングがすでにあるプロセスにロードされます。これは最低でも無駄です。ライブラリが満足していない依存関係を持つようにするには、ビルドフラグを使用する方が良いでしょうか? –

答えて

1

私は同じ問題を抱え、標準C++ライブラリのモジュールを追加して解決しました。 ndk-buildシステムによってリンクされたライブラリは間違った場所にあります(私の場合、プラットフォーム/ android-9/arch-arm/usr/lib)。

include $(CLEAR_VARS) 
LOCAL_MODULE := rightstdc 
LOCAL_SRC_FILES := <path to the correct libstdc++.a> 
include $(PREBUILT_STATIC_LIBRARY) 

静的ライブラリのリストにモジュールのタグを追加:任意のライブラリはLOCAL_LDLIBSではなく、間違った道である私の場合には指定されている場合

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc 

build/core/build-binary.mk前に付加-L$(SYSROOT)/usr/lib

適切なlibstdC++をその場所にコピーする必要のない手順があるかどうかはわかりませんが、上記の方法が有効です。内側に配置されて静的にSTLportを使用するための

APP_STL := stlport_static 

を:

+0

C++ライブラリ関連の情報をApplication.mkにいくつかのcppフラグとともに追加します –

3

さて、あなたはAndroid.mkファイルと同じフォルダ内にApplication.mkファイルの作成を含む、であることを実際に修正することができますAndroid NDK。

関連する問題