Точка входа не найдена, файл Android .so - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь включить скомпилированный код C в приложение для Android.Я смог использовать NDK для создания исходного кода, и он создал и .so (7 КБ), и .a (почти 2 МБ).

Я использую Xamarin, и все инструкции говорят:включить .so в проект.Я сделал это, и приложение загружает библиотеку.Однако он генерирует исключение EntryPointNotFoundException.Меня это не удивляет, потому что .so не содержит ничего, кроме функций поддержки RTL.Фактический код находится в .a.

Итак, у меня есть два вопроса: 1. Как я могу связать .a с моей библиотекой Android?или 2. Как я могу заставить NDK упаковать все в один .so?

For what it's worth here is the .mk file:

ROOT := $(call my-dir)

# Build libopus
LOCAL_PATH          := ../opus-1.2.1/opus-1.2.1
include $(CLEAR_VARS)
#include the .mk files
include $(LOCAL_PATH)/celt_sources.mk
include $(LOCAL_PATH)/silk_sources.mk
include $(LOCAL_PATH)/opus_sources.mk

LOCAL_MODULE        := opus

#fixed point sources
SILK_SOURCES += $(SILK_SOURCES_FIXED)

#floating point sources - this throws badly!
#SILK_SOURCES += $(SILK_SOURCES_FLOAT)

#ARM build
CELT_SOURCES += $(CELT_SOURCES_ARM)
SILK_SOURCES += $(SILK_SOURCES_ARM)
LOCAL_SRC_FILES     := \
$(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES)

LOCAL_LDLIBS        := -lm -llog


LOCAL_C_INCLUDES    := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/silk \
$(LOCAL_PATH)/silk/float \
$(LOCAL_PATH)/celt

LOCAL_CFLAGS        := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
#LOCAL_CFLAGS        += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT=1 -DDISABLE_FLOAT_API -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CFLAGS        += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CPPFLAGS      := -DBSD=1
LOCAL_CPPFLAGS      += -ffast-math -O3 -funroll-loops

#include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := opus-share
#LOCAL_SRC_FILES := libopus.a
LOCAL_STATIC_LIBRARIES := opus
include $(BUILD_SHARED_LIBRARY)

Спасибо.

1 Ответ

0 голосов
/ 29 января 2019

Я могу подтвердить, что переход на LOCAL_WHOLE_STATIC_LIBRARIES действительно был решением.Также оригинальный mk пытается быть как с фиксированной, так и с плавающей точкой.Итак, окончательное исправление всего этого:

# This .mk has to be in a folder called jni. Because :(
ROOT := $(call my-dir)

# Build libopus.a (static library)
LOCAL_PATH          := ../opus-1.2.1/opus-1.2.1
include $(CLEAR_VARS)
#include the .mk files
include $(LOCAL_PATH)/celt_sources.mk
include $(LOCAL_PATH)/silk_sources.mk
include $(LOCAL_PATH)/opus_sources.mk

LOCAL_MODULE        := opus

#fixed point sources
SILK_SOURCES += $(SILK_SOURCES_FIXED)

#floating point sources - this throws badly!
#SILK_SOURCES += $(SILK_SOURCES_FLOAT)

#ARM build
CELT_SOURCES += $(CELT_SOURCES_ARM)
SILK_SOURCES += $(SILK_SOURCES_ARM)
LOCAL_SRC_FILES     := \
$(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES)

LOCAL_LDLIBS        := -lm -llog

LOCAL_C_INCLUDES    := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/silk \
$(LOCAL_PATH)/silk/fixed \
$(LOCAL_PATH)/celt

LOCAL_CFLAGS        := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS        += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT=1 -DDISABLE_FLOAT_API -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
#LOCAL_CFLAGS        += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CPPFLAGS      := -DBSD=1
LOCAL_CPPFLAGS      += -ffast-math -O3 -funroll-loops

include $(BUILD_STATIC_LIBRARY)

# Now create a dynamic library that contains the static library
include $(CLEAR_VARS)
LOCAL_MODULE    := opus-share
#LOCAL_SRC_FILES := opus
LOCAL_WHOLE_STATIC_LIBRARIES := opus
include $(BUILD_SHARED_LIBRARY)

Это было построено с использованием Windows NDK, и мне пришлось поместить этот файл (называемый Android.mk) в каталог с именем «JNI». Может быть, есть какая-то хитростьчтобы избежать этого с переменными окружения, но я перестал пытаться бороться с этим.Добавьте к этому исходный код opus 1.2.1 и mk-файлы для конкретной платформы, например:

APP_ABI := arm64-v8a
APP_PLATFORM := android-19
APP_STL := c++_static
APP_BUILD_SCRIPT := Android.mk

, и вы получите файлы .so для Android.Просто измените значение ABI соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...