JNI Wrapping - 未导出的函数

时间:2014-11-03 00:13:16

标签: android android-ndk java-native-interface shared-libraries nativelibrary

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

我认为我的功能未正确导出。

我采取的步骤:

  1. 我已经创建了一个java类,其中包含我想在我的Android应用程序中使用的函数,
  2. 使用javah和javac创建存根(执行此操作后我没有更改任何类名或包名),
  3. 将包装文件添加到Android.mk
  4. 构建.so库(使用ndk-build)
  5. 将.so文件复制到我的android项目的libs / armeabi文件夹
  6. 在我的Android代码中加载了库并调用了本机函数 - > unsatisfiedinkerror。
  7. 当我尝试在我的Android代码中使用该库时,我能够加载库,但它无法找到我的包装函数。

    System.loadLibrary("openal"); // Works
    OpenAlConnector.init(); // My wrapped function throws an unsatisfiedlinkerror
    

    我认为我的功能实际上并未导出。

    为了添加我的包装函数,我修改了OpenAL-MOB项目中已经存在的Android.mk。我在构建过程中没有遇到任何错误。我唯一做的就是在LOCAL_SRC_FILES的末尾添加2个文件(由javah创建的.c和一个帮助类)。

    Android.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文件中有问题吗?

    我现在试着将这个库包装好几天了,而且我已经非常绝望了。非常感谢任何帮助!

    修改 我认为它与将库首先构建为静态然后作为共享库有关。如果我创建一个像这样的共享库,似乎所有的符号都会丢失。有人可以给我额外的信息吗?

0 个答案:

没有答案