Невозможно создать локальную общую библиотеку в Android Ndk
Я хочу собрать библиотеку.so для версии 4.0.3, но я не могу это сделать. Я чувствую, что эти проблемы вызваны тем, что мой файл.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&)'
Любая помощь будет оценена.
1 ответ
Android NDK поддерживает pthread
s, но не предоставляет libpthread как обычно в наборах инструментов Linux. Ваше первое сообщение об ошибке исчезнет, если вы используете
LOCAL_CFLAGS += -DHAVE_PTHREADS
и не добавить LOCAL_LDLIBS += -lpthread
Относительно неопределенной ссылки на do_copy()
, это происходит из системной библиотеки libutils.so
, Не безопасно использовать библиотеки, которые официально не публикуются с NDK (см. Больше здесь), поэтому вам лучше переписать этот кусок кода.
Возможно, вы получили Android.mk
файл из источника Google или одной из его вилок. Я сомневаюсь, что полученная библиотека будет пригодна для использования, потому что libbinder.so
требуется системное приложение с повышенными разрешениями, которое будет загружено при запуске приложения.
В любом случае, ссылаясь на системные библиотеки как LOCAL_SHARED_LIBRARIES
не работает с ndk-build
, Вместо LOCAL_SHARED_LIBRARIES := liblog libcutils libutils
вы должны написать
LOCAL_LDLIBS += -llog -lcutils -lutils