我正在尝试包装 c-library (OpenAL-MOB) 的一些功能,以便在我的 Android 应用程序中使用它们。
我认为我的函数没有正确导出。
我采取的步骤:
- 我用我想在我的 Android 应用程序中使用的功能制作了一个 java 类,
- 使用 javah 和 javac 创建存根(在此之后我没有更改任何类名或包名),
- 将包装文件添加到 Android.mk
- 构建一个 .so 库(使用 ndk-build)
- 将 .so 文件复制到我的 android 项目的 libs/armeabi 文件夹中
- 在我的android代码中加载了库并调用了本机函数-> unsatisfiedinkerror。
当我尝试在我的 android 代码中使用该库时,我能够加载该库,但它找不到我的包装函数。
System.loadLibrary("openal"); // Works
OpenAlConnector.init(); // My wrapped function throws an unsatisfiedlinkerror
我认为我的函数实际上并没有导出。
为了添加我的包装函数,我修改了 OpenAL-MOB 项目中已经存在的 Android.mk。在构建过程中我没有收到任何错误。我唯一做的就是在 LOCAL_SRC_FILES 的末尾添加 2 个文件(由 javah 创建的 .c 和一个辅助类)。
安卓.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include $(LOCAL_PATH)/../../OpenAL32/Include $(LOCAL_PATH)/../../mob/Include $(LOCAL_PATH)
LOCAL_MODULE := openal-static
LOCAL_SRC_FILES := ../../Alc/ALc.c ../../Alc/alcConfig.c ../../Alc/alcDedicated.c ../../Alc/alcEcho.c ../../Alc/alcModulator.c ../../Alc/alcReverb.c ../../Alc/alcRing.c ../../Alc/alcThread.c ../../Alc/ALu.c ../../Alc/backends/loopback.c ../../Alc/backends/null.c ../../Alc/backends/opensl.c ../../Alc/backends/wave.c ../../Alc/bs2b.c ../../Alc/helpers.c ../../Alc/hrtf.c ../../Alc/mixer.c ../../Alc/mixer_c.c ../../Alc/mixer_inc.c ../../Alc/mixer_neon.c ../../Alc/mixer_sse.c ../../Alc/panning.c ../../mob/alConfigMob.c ../../OpenAL32/alAuxEffectSlot.c ../../OpenAL32/alBuffer.c ../../OpenAL32/alEffect.c ../../OpenAL32/alError.c ../../OpenAL32/alExtension.c ../../OpenAL32/alFilter.c ../../OpenAL32/alListener.c ../../OpenAL32/alSource.c ../../OpenAL32/alState.c ../../OpenAL32/alThunk.c openalwrapper.c org_vansina_openal_OpenAlConnector.c
# set the platform flags
ifeq ($(APP_ABI),x86)
LOCAL_CFLAGS += -D HAVE_SSE
else
LOCAL_CFLAGS += -D HAVE_NEON -mfloat-abi=softfp -mfpu=neon -marm
endif
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := openal
LOCAL_STATIC_LIBRARIES := openal-static
include $(BUILD_SHARED_LIBRARY)
我使用 NM 查看导出了哪些函数(nm.exe -D libopenal.so)。结果是这样的:
00002004 A __bss_start
U __cxa_atexit
U __cxa_finalize
00002004 A _edata
00002004 A _end
我不确定我是否正确,但似乎我的功能丢失了。有人知道我可以做什么或检查吗?我的 .mk 文件有问题吗?
我现在尝试将这个库包装好几天,我变得非常绝望。很感谢任何形式的帮助!
编辑: 我相信它与首先将库构建为静态库然后作为共享库有关。如果我创建这样的共享库,似乎所有符号都会丢失。有人可以给我有关此的其他信息吗?