1

バージョン 4.0.3 のライブラリ .so をビルドしたいのですが、できません。私が感じているのは、.mk ファイルがライブラリとリンクしていないために、これらの問題が発生していることです。

Android.mk ファイル

Binder.cpp \
BpBinder.cpp \
CursorWindow.cpp \
IInterface.cpp \
IMemory.cpp \
IPCThreadState.cpp \
IPermissionController.cpp \
IServiceManager.cpp \
MemoryDealer.cpp \
MemoryBase.cpp \
MemoryHeapBase.cpp \
MemoryHeapPmem.cpp \
Parcel.cpp \
PermissionCache.cpp \
ProcessState.cpp \
Static.cpp

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
 LOCAL_LDLIBS += -lpthread
LOCAL_MODULE := libbinder1
LOCAL_SHARED_LIBRARIES := liblog libcutils libutils
LOCAL_SRC_FILES := $(sources)
include $(BUILD_SHARED_LIBRARY)

#include $(CLEAR_VARS)
#LOCAL_CFLAGS += -DHAVE_PTHREADS 
#LOCAL_LDLIBS += -lpthread
#LOCAL_MODULE := libbinder
#LOCAL_SRC_FILES := $(sources)
#include $(BUILD_STATIC_LIBRARY)

このファイルは、静的な .a ファイルをビルドしますが、共有ライブラリのビルド中に次のエラーが表示されます。

[armeabi] Compile++ thumb: binder1 <= IPCThreadState.cpp
jni/IPCThreadState.cpp:292:8: error: 'pthread_mutex_t' does not name a type
jni/IPCThreadState.cpp:294:8: error: 'pthread_key_t' does not name a type
jni/IPCThreadState.cpp: In static member function 'static android::IPCThreadState*        android::IPCThreadState::self()':

LOCAL_CFLAGS += -DHAVE_PTHREADS を使用して上記のエラーを修正しました

しかし今、ライブラリの生成時に、膨大な数のエラー リストが表示されます。

   D:/android-ndk-r9c-windows-x86/android-ndk-r9c/toolchains/arm-linux-androideabi-     4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-   androideabi/bin/ld.exe: error: cannot find -lpthread
D:/android-ndk-r9c-windows-x86/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi/objs/binder1/Binder.o: in function android::Vector<android::String16>::do_copy(void*, void const*, unsigned int) const:jni/utils/TypeHelpers.h:142: error: undefined reference to 'android::String16::String16(android::String16 const&)'

どんな助けでも大歓迎です。

4

1 に答える 1

2

Android NDK は s をサポートしていますが、Linux ツールチェーンでは通常のようにlibpthreadpthreadを提供していません。を使用すると、最初のエラー メッセージは表示されなくなります。

LOCAL_CFLAGS += -DHAVE_PTHREADS

追加しないLOCAL_LDLIBS += -lpthread

への未定義の参照に関してはdo_copy()、システム ライブラリからのものですlibutils.so。NDK で公式に公開されていないライブラリを使用するのは安全ではないため (詳細はこちらを参照)、このコードを書き直したほうがよいでしょう。

おそらく、 Google ソースまたはそのフォークの 1 つAndroid.mkからファイルを受け取ったでしょう。元のライブラリには、アプリの起動時に権限が昇格されたシステム アプリが読み込まれる必要があるため、結果のライブラリが使用可能になるとは思えません。libbinder.so

とにかく、システム ライブラリを として参照することLOCAL_SHARED_LIBRARIESは では機能しませんndk-buildLOCAL_SHARED_LIBRARIES := liblog libcutils libutilsあなたが書くことを期待されている代わりに

LOCAL_LDLIBS += -llog -lcutils -lutils
于 2014-03-04T17:25:23.517 に答える