4

私はいくつかのjni動的ライブラリ(* .so)を持っています。これは、CPU機能に関連しています。たとえば、一部のライブラリはarmv7 + neon cpuをサポートし、一部のライブラリはarmv7 + vfpv3 cpuをサポートし、一部のライブラリは非armv7cpusをサポートします。

CPUの能力に応じて動的にロードする方法は?

次のコードを試しましたが、機能しません。

このソリューションでは、以下の異なる名前で3つのlibsバージョンをインストールパッケージに入れました:(元の名前はlibavcodec.soです)

  1. libavcodec_neon.soおよびlibavutil_neon.so
  2. libavcodec_vfpv3.soおよびlibavutil_vfpv3.so
  3. libavcodec_basic.soおよびlibavutil_basic.so

ただし、libavcodec.soはlibavutil.soに依存しているため、名前が変更されているため、loadLibrary関数は失敗します。

たぶん私はそれらをロードする前に元の名前にlibsの名前を変更することができます、それを行う方法は?

   String cpu_ability = getCpuAbility();    

    if (cpu_ability.equals("cpuinfo_armv7_neon")) {
        System.loadLibrary("avutil_neon");
        System.loadLibrary("avcodec_neon");
    }
    else if (cpu_ability.equals("cpuinfo_armv7_vfpv3")) {
        System.loadLibrary("avutil_vfpv3");
        System.loadLibrary("avcodec_vfpv3");
    }
    else {
        System.loadLibrary("avutil_basic");
        System.loadLibrary("avcodec_basic");
    }
4

1 に答える 1

2

私はこの質問を解決する方法を見つけました。

ディレクトリ/data/data/<appname>/libを変更できないため、ライブラリを/data/data/<appname>/filesディレクトリにコピーして名前を変更しました。

たとえば、armv7 + neonの状況では、libavcodec_neon.soをfilesディレクトリにコピーし、名前をlibavcodec.soに変更しました。他のライブラリもそうです。次に、filesディレクトリからそれらをロードします。

于 2013-03-29T06:41:46.747 に答える