3

我正在尝试包装 c-library (OpenAL-MOB) 的一些功能,以便在我的 Android 应用程序中使用它们。

我认为我的函数没有正确导出。

我采取的步骤:

  1. 我用我想在我的 Android 应用程序中使用的功能制作了一个 java 类,
  2. 使用 javah 和 javac 创建存根(在此之后我没有更改任何类名或包名),
  3. 将包装文件添加到 Android.mk
  4. 构建一个 .so 库(使用 ndk-build)
  5. 将 .so 文件复制到我的 android 项目的 libs/armeabi 文件夹中
  6. 在我的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 文件有问题吗?

我现在尝试将这个库包装好几天,我变得非常绝望。很感谢任何形式的帮助!

编辑: 我相信它与首先将库构建为静态库然后作为共享库有关。如果我创建这样的共享库,似乎所有符号都会丢失。有人可以给我有关此的其他信息吗?

4

0 回答 0