Android アプリケーションで使用するために、c ライブラリ (OpenAL-MOB) のいくつかの関数をラップしようとしています。
関数が正しくエクスポートされていないと思います。
私が取ったステップ:
- Android アプリケーションで使用したい関数を含む Java クラスを作成しました。
- javah と javac を使用してスタブを作成しました (これを行った後、クラス名またはパッケージ名を変更していません)。
- ラッパー ファイルを Android.mk に追加しました
- .so ライブラリをビルドする (ndk-build を使用)
- .so ファイルを Android プロジェクトの libs/armeabi-folder にコピーしました
- 私の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 とヘルパー クラス) を追加することでした。
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 ファイルに問題はありますか?
私はこのライブラリを数日間ラップしようとしていますが、かなり必死になっています。どんな助けでも大歓迎です!
編集: ライブラリを最初に静的ライブラリとして構築し、次に共有ライブラリとして構築することに関係があると思います。そのような共有ライブラリを作成すると、すべてのシンボルが失われるようです。誰かがこれについて追加情報を教えてもらえますか?