2012-01-03 18 views
4

私はandroid-cmakeとlibstdC++に対するNDK、android-ndk-r7/docs/CPLUSPLUS-SUPPORT.htmlの共有ライブラリをコンパイルしました私は自分のライブラリをロードする前にgnustl_shared負荷しようとしています:AndroidのGNU STL共有ライブラリがSystem.loadLibraryで見つかりません

static { 
    System.loadLibrary("gnustl_shared"); 
    System.loadLibrary("MathTest"); 
} 

を、私はこれはインスタンスhereのために行われますが、私は例外を取得されて見ることができます:それは、

01-03 20:02:42.307: E/AndroidRuntime(569): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null 

私はgnustl_sharedロードしない場合この例外で失敗する:

01-03 20:03:04.667: E/AndroidRuntime(603): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1311]: 33 cannot locate '_ZNSo3putEc'... 

APIレベル8と9で同じ問題をテストしました。私は間違って何をしていますか?私は、最後の例外で探しているシンボルがSTLに関連していて、ロードすることで問題が解決されると仮定します。これは本当ですか?

編集: 私は現在、回答で示唆されているようにSTLライブラリを含めました。 CMakeが生成するコンパイル行はこれです(私のプロジェクトには、(George MarsaligaのMother of All Random Number Generatorのコピーはhereです)Driver.cppという3つのファイルがあり、異なる数学ライブラリをテストして関数ランタイムを出力する関数が含まれています。そして私は、これは有用な情報であるかどうかわからないんだけど

[ 33%] Building CXX object CMakeFiles/MathTest.dir/src/Driver.cpp.o 
/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -DMathTest_EXPORTS -D__STDC_INT64__ --sysroot=/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fexceptions -fno-check-new -fno-common -fstrict-aliasing -Wno-variadic-macros -Wextra -pedantic -g0 -O2 -fPIC -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/Users/martin/Repositories/MathTest/lib/cml-1_0_2 -I/Users/martin/Repositories/MathTest/lib/eigen-eigen-13a11181fc5a -I/Users/martin/Repositories/MathTest/lib/glm-0.9.3.B -o CMakeFiles/MathTest.dir/src/Driver.cpp.o -c /Users/martin/Repositories/MathTest/src/Driver.cpp 
"/Applications/CMake 2.8-4.app/Contents/bin/cmake" -E cmake_progress_report /Users/martin/Repositories/MathTest/build/android/CMakeFiles 2 
[ 66%] Building C object CMakeFiles/MathTest.dir/src/mother.c.o 
/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc -DMathTest_EXPORTS -D__STDC_INT64__ --sysroot=/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -O3 -DNDEBUG -fPIC -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/Users/martin/Repositories/MathTest/lib/cml-1_0_2 -I/Users/martin/Repositories/MathTest/lib/eigen-eigen-13a11181fc5a -I/Users/martin/Repositories/MathTest/lib/glm-0.9.3.B -o CMakeFiles/MathTest.dir/src/mother.c.o -c /Users/martin/Repositories/MathTest/src/mother.c 
"/Applications/CMake 2.8-4.app/Contents/bin/cmake" -E cmake_progress_report /Users/martin/Repositories/MathTest/build/android/CMakeFiles 3 
[100%] Building CXX object CMakeFiles/MathTest.dir/src/androidactivity.cpp.o 
/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -DMathTest_EXPORTS -D__STDC_INT64__ --sysroot=/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fexceptions -fno-check-new -fno-common -fstrict-aliasing -Wno-variadic-macros -Wextra -pedantic -g0 -O2 -fPIC -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -isystem /Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/Users/martin/Repositories/MathTest/lib/cml-1_0_2 -I/Users/martin/Repositories/MathTest/lib/eigen-eigen-13a11181fc5a -I/Users/martin/Repositories/MathTest/lib/glm-0.9.3.B -o CMakeFiles/MathTest.dir/src/androidactivity.cpp.o -c /Users/martin/Repositories/MathTest/src/androidactivity.cpp 
Linking CXX shared library ../../android/libs/armeabi/libMathTest.so 

readelfが私のライブラリが依存していることを示してJNI接着剤が含まれており、Driver.cppからテスト関数を呼び出します。次のようにCMakeによって生成された冗長Makefileの出力がある。androidactivity.cpplibstdc++libmlibcおよびlibdlにあり、私が知る限りlibstdc++を除くすべてのデバイスは、android-ndk-r7/docs/STABLE-APIS.htmlとしてデバイスで使用できます。

Martin-Foots-MacBook-Pro:android martin$ ~/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-readelf -d ../../android/libs/armeabi/libMathTest.so 

Dynamic section at offset 0x14b0 contains 25 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libstdc++.so] 
0x00000001 (NEEDED)      Shared library: [libm.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x0000000e (SONAME)      Library soname: [libMathTest.so] 
0x00000010 (SYMBOLIC)     0x0 
0x00000019 (INIT_ARRAY)     0x9498 
0x0000001b (INIT_ARRAYSZ)    12 (bytes) 
0x0000001a (FINI_ARRAY)     0x94a4 
0x0000001c (FINI_ARRAYSZ)    12 (bytes) 
0x00000004 (HASH)      0xd4 
0x00000005 (STRTAB)      0x544 
0x00000006 (SYMTAB)      0x234 
0x0000000a (STRSZ)      1033 (bytes) 
0x0000000b (SYMENT)      16 (bytes) 
0x00000003 (PLTGOT)      0x9598 
0x00000002 (PLTRELSZ)     136 (bytes) 
0x00000014 (PLTREL)      REL 
0x00000017 (JMPREL)      0x990 
0x00000011 (REL)      0x950 
0x00000012 (RELSZ)      64 (bytes) 
0x00000013 (RELENT)      8 (bytes) 
0x00000016 (TEXTREL)     0x0 
0x6ffffffa (RELCOUNT)     4 
0x00000000 (NULL)      0x0  

この情報は役立ちますか?根拠のないシンボルがどこから来るのかを私が知る方法はありますか?

答えて

0

おそらくApplication.mkにも追加する必要があります。あなたがリンクしたプロジェクトdid this at least

+0

残念ながら、これは私がndk-buildを使用していないので役に立たない。私はすべてのソースをコンパイルするためにCMakeを使用しています。 –

0

あなたのAPK libs/*に適切なlibgnustl_shared.so(あなたが使用する予定のABIごとに1つ)をパッケージ化する必要があると思います。これは、私があなたに伝えることができないカスタムCMakeビルドシステムとまったく同じ意味です。

APKはちょうどzipファイルです。あなたのファイルを開くことができ、ファイルが期待どおりに存在することを確認できます。私は同じ問題を満たし

+1

情報をありがとう、私は正常にAndroidでSTLライブラリを正常に読み込むことができますが、私は自分のライブラリをロードしようとしているときにも同じ例外が発生します。私はより多くを調査し、より多くの情報で私のポストを更新します。 –

-2

、しかし、私はすべてがlibgnustl_shared.soに依存して、6つの共有ライブラリを持つ大規模なビルドを作って、私は2つのABIのビルドを作っ:armeabiとarmeabi-v7a すべての共有ライブラリを手動でLIBSにコピーされました/(abi-name)/(libgnustl-shared.soを含む)。私は最初にSystem.load( "gnustl_shared")を作ったが、アンドロイドの活動がlibをロードしようとするたびに、それは除外され、gnustl_sharedが見つからないと言った。 Androip-8、android-9、android-14で試したところ、すべて同じエラーがあります。

_HERE THE ANDROID.MK_ 

MYTOP_DIR  := $(call my-dir) 
LOCAL_PATH  := $(MYTOP_DIR) 
include $(CLEAR_VARS) 

NDK_ROOT   := /home/workspace/android-ndk-r7 
RUNTIME_STL_PATH :=$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++ 

# name of the module to be built 
LOCAL_MODULE := MyMediaPlayer 
LOCAL_SRC_FILES := MyMediaPlayer.cpp 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libMediaClient/include 

# rule definition 
LOCAL_CPP_EXTENSION := .cxx .cpp .cc 
LOCAL_CFLAGS  += -I$(RUNTIME_STL_PATH)/include 
LOCAL_CFLAGS  += -I$(RUNTIME_STL_PATH)/libs/$(TARGET_ARCH_ABI)/include 
LOCAL_LDLIBS  += -llog 
LOCAL_LDLIBS  += -landroid 
LOCAL_LDLIBS  += -L$(RUNTIME_STL_PATH)/libs/$(TARGET_ARCH_ABI) 
LOCAL_LDLIBS  += -lgnustl_shared 
LOCAL_LDLIBS  += -L$(LOCAL_PATH)/libMediaClient/lib/android/$(TARGET_ARCH_ABI) 
LOCAL_LDLIBS  += -lMediaClient 
LOCAL_LDLIBS  += -ltools 
include $(BUILD_SHARED_LIBRARY) 


_HERE THE APPLICATION.MK_ 

APP_ABI    := armeabi armeabi-v7a 
APP_STL    := gnustl_shared # this doesn't make any sense 
APP_MODULES   := MyMediaPlayer 

例外は私自身のLIBSをロードすることによって発生しますが、ここでlibgnustil_sharedは何ここで間違って、NDKから来た場合、私は理解できます!

スティーブンも

+2

それは答えではありません –

1

、あなたは、独自のライブラリの前にgnustl_sharedロードするには、このような何かが必要です。

static { 
    System.loadLibrary("gnustl_shared"); 
    System.loadLibrary("myNativeLib1"); 
    System.loadLibrary("myNativeLib2"); 
    //....... 
} 
0

をあなたはcmakeのが生成するコマンド++ Gを示しました。彼らはOKに見えます。しかし、リンカーはシステムSTLライブラリに基づいてlibMathTest.soを生成しました。実際には、システムSTLとgnustlが混在しています(おそらくcxx-stl/gnu-libstdC++/からのものです)。

あなたは

Linking CXX shared library ../../android/libs/armeabi/libMathTest.so 

の後ろに実際のコマンドをエコー場合、それが役立つだろうしかし、おそらく、アプリケーションがシステムのSTLライブラリに満足することができますか? 1つの重要な利点は、libstdC++。soがすべてlibmのようにすべてのデバイスにプリインストールされていることです。

0

私の場合、gnustl_sharedライブラリは実際にはAndroid 2.3.6を実行しているデバイスにはありません。私がgnustlを静的にリンクすると、NDKアプリケーションはデバイス上で正常に動作します。 私の2セント

関連する問題