3

私はここで夢中になります。

基本的に、NDK を使用して、Android プラットフォームの system/lib/ にある共有ライブラリのいくつかの関数にアクセスしようとしています。

私が利用しようとしているライブラリは libsonivox.so です。私の主な目標は、NativeActivity から使用することです。このライブラリに依存する独自のライブラリをロードする前に、このライブラリを (静的に) ロードする必要があるため、これが複雑になる可能性があることを理解しています。したがって、通常のアクティビティと JNI を使用して動作させようとしています。

アクティビティでは、次のようにライブラリをロードします。

static {
  System.loadLibrary("sonivox");
  System.loadLibrary("native-audio-jni");
}

「native-audio-jni」ライブラリは NDK サンプルからのものですが、sonivox 機能にアクセスするための初歩的な試みで変更しています。

libnative-audio-jni から libsonivox を呼び出さなくても、すべて正常にコンパイルされます。LogCat 出力からの次の行は、希望を与えてくれます。

  04-26 15:01:14.973: D/dalvikvm(691): No JNI_OnLoad found in /system/lib/libsonivox.so   
  0x412a1100, skipping init

したがって、ライブラリがロードされます。

次に、この関数を native-audio-jni.c に追加します。

void Java_jay_enn_eye_JNImidiActivity_createMidi(JNIEnv* env,
        jclass clazz)
{
  pLibConfig = EAS_Config();
}

pLibConfig は次のように宣言されます。

static const S_EAS_LIB_CONFIG* pLibConfig = NULL;

それが宣言されている場合、上記の関数を追加しなくても、正常にコンパイルされます。したがって、少なくともヘッダーファイルは...そこにあります。

その関数をコードに挿入すると、ndk-build の出力が次のようになります。

  Compile thumb  : native-audio-jni <= native-audio-jni.c
  SharedLibrary  : libnative-audio-jni.so
  ./obj/local/armeabi/objs/native-audio-jni/native-audio-jni.o: In function
  `Java_jay_enn_eye_JNImidiActivity_createMidi':
  /home/anthony/Documents/eclipse/JNImidi/jni/native-audio-jni.c:202: undefined   
  reference
  to `EAS_Config'
  collect2: ld returned 1 exit status
  make: *** [obj/local/armeabi/libnative-audio-jni.so] Error 1

libnative-audio-jni が libsonivox にアクセスできないだけなのか、それとも dlsym() または sym() をリンクして sonivox 関数を使用する必要があるのか​​はわかりません。ライブラリが system/lib/ にあり、私が提供していないため、どちらも試すことができませんでした。そのための完全なパスがありません。

私が検討しているもう 1 つのオプションは、libsonivox.so を取得してプロジェクト内のディレクトリにコピーし、Android.mk を変更して、ビルド済みの共有ライブラリとして lib が含まれるようにすることです。コンパイル時にライブラリを含める必要があるのではないかと考えていました。

編集: Android.mk ファイルは次のとおりです。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := native-audio-jni
LOCAL_SRC_FILES := native-audio-jni.c
# for native audio
LOCAL_LDLIBS    += -lOpenSLES
# for logging
LOCAL_LDLIBS    += -llog
# for native asset manager
LOCAL_LDLIBS    += -landroid

include $(BUILD_SHARED_LIBRARY)

これはどこかがおかしいに違いない。すべてをコンパイルするときに、sonivox ライブラリが存在する必要があると思います。ただし、このファイルにどのような変更を加えても、ライブラリはロードされません。主に、PREBUILT_SHARED_LIBRARY または PREBUILT_STATIC_LIBRARY としてインクルードしようとすることです。また、OpenSL のものは完全に正常に動作します。-lsonivoxとして含めるだけであれば、sonivoxが機能することを願っていますが、そうではありません。

4

1 に答える 1

2

他のことで夢中になっていましたが、最近これに対する答えを見つけました
.libsonivox.soは動的にロードできます。Android デバイスから .so をコピーして $NDK-ROOT/platforms/android-14/arch-arm/usr/lib に配置する必要があります。「android-14」は代わりにどのバージョンでもかまいません。
そうすれば、それに対してコンパイルでき、アプリがデバイスで実行されているときに、そのデバイスのライブラリが使用されます。

于 2012-10-30T07:45:09.897 に答える