1

ARMv6、ARMv6 + vfp、ARM7 + vfp、ARM7 + Neon、ARM7 + Tegra、およびいくつかのユニバーサルライブラリなど、さまざまなターゲットにネイティブライブラリを使用するアプリケーションがあります。私の目標は、すべてのライブラリを1つの.apkファイルにパックして、個別のビルドを配布する必要がないようにすることです。.apkの合計サイズについてはあまり気にしません。

これが私のAndroid.mkスクリプトです–単なる例ですが、十分な情報があります:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi
LOCAL_MODULE := prebuilt_arm_v6vfp
LOCAL_SRC_FILES := ../bin/libplayer_v6vfp.so
LOCAL_EXPORT_LDLIBS := ../libplayer_v6vfp.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_MODULE := prebuilt_arm_v7n
LOCAL_SRC_FILES := ../bin/libplayer_v7n.so
LOCAL_EXPORT_LDLIBS := ../libplayer_v7n.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := player

LOCAL_SRC_FILES := some_cpp_sources...

LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../bin
LOCAL_LDLIBS := -llog -lz -lm -lplayer_v7n -lplayer_v6vfp
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

今、私は次の問題を抱えています–それはlibsフォルダarmeabiarmeabi-v7aサブフォルダを作成します–それはOKです。ただし、両方のサブフォルダーの内容は同じであり、どちらにもlibplayer_v7n.soとlibplayer_v6vfp.soが含まれています。

各サブフォルダーに、eabiバージョンに応じた正しいバージョンのネイティブライブラリのみが含まれていることを確認するにはどうすればよいですか?

編集1:

ご覧のとおり、libplayer.soを両方の共有ライブラリにリンクしています。これらには互換性のあるインターフェイスがあります。CPUタイプを検出した後、Javaラッパーをロードするときに、正しいライブラリを動的に選択したかったのです。しかし、それは不可能のようです。正しいライブラリを動的に選択する方法はありますか?このような一般的なケースには解決策が必要です。

編集2:

libplayer.soを1つのライブラリにのみリンクでき、実行時に正しいバージョンを選択する必要があるようです。しかし、ここで問題となるのは、さまざまなバージョンで同じ名前の6つのネイティブライブラリをlibフォルダーに保存する方法です。サブフォルダーは明らかな解決策のようですが、それが可能かどうかはわかりません。もう1つの解決策は、プラグインとして別の.apkを介して正しいライブラリをデプロイすることですが、それは絶対に避けたいと思います。

4

1 に答える 1

2

次に、次の手順を実行します。

  1. 同じ名前のアーキテクチャ固有のライブラリに名前を付け(例:libplayer_arch.so)、それらを異なるディレクトリに配置します。
  2. libplayer.soをlibplayer_arch.soにリンクします
  3. 次のようにJavaコードを記述します。

if (isArmv7())
{
    System.loadLibrary("armv7/libplayer_arch.so");
}
else
{
    System.loadLibrary("armv6/libplayer_arch.so");
}
System.loadLibrary("libplayer.so");
于 2012-05-29T19:33:35.907 に答える