Android StudioはSystemを使用する.loadLibrary()のいくつかの問題

4672 ワード

私は最近ずっとAndorid Studioとsdkを更新して、私は今3.6のAndroid Studioを使って、sdkのapiはすでに27に更新して、andorid 8.0
はい、他のことは言わないで、私の問題を話しましょう.私は今いくつかロードしています.soパッケージでは次のような問題が発生しました

     java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/device.android.com.hfdemo1-1/base.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_dependencies_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_0_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_1_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_2_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_3_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_4_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_5_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_6_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_7_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_8_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/device.android.com.hfdemo1-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libSerialPort.so"
                      at java.lang.Runtime.loadLibrary(Runtime.java:367)
                      at java.lang.System.loadLibrary(System.java:1076)

apiが23より大きいと次のような問題が発生したり、参照が構成されていない場合にも次のような問題が発生します.

couldn't find "libSerialPort.so"
                      at java.lang.Runtime.loadLibrary(Runtime.java:367)
                      at java.lang.System.loadLibrary(System.java:1076)

*APIが23より大きい場合に参照される最初の問題が解決する.soパッケージの問題*
発生した環境:このような問題は一般的にAndroid 6.0以上のシステムで発生し、具体的には他のapiバージョンにも存在し、主にapi>=23に集中している.
同じアプリをapi<=22のsdkの場合にコンパイルし、正常に動作し、フラッシュバックや存在しない.soライブラリのロードに失敗した場合、api>=23のsdkコンパイルを採用した場合、Android 6.0以上の携帯電話にインストールすると、広範囲にクラッシュや.soライブラリのロードに失敗したが、6.0以下の携帯電話は正常だった.
Catch   :dlopen failed: cannot locate symbol "XXXX" xxxx.so, XX    ,      。

第一に、あなたのAPK target APIを先に23以下に下げて、もしできないならば更にコンパイルする時APIを23以下に下げて、また問題が発生して引き続き下げて、これはあなたの多くのAndroid Sdkの新しいコントロールが使えないことを意味します;
2つ目はあなたが持っていることです.soファイルのソースコード、Application.mkでAPP_を修正STL,再コンパイル.so、もし、もしあなたがソースがなければ、悲劇は、彼らが解決するのを待つか、最初の方法を採用するか、試してみることをお勧めします.APP_STL := gnustl_shared,
注:再コンパイルするには、ここに行ってみてください.http://www.cnblogs.com/linguanh/p/4624768.html
  • *正しい参照方法soパッケージ*
  • 加入.soパケット、libsの下に追加するか、jniLibsの下に戻る
  • はパッケージを参照し、jniLibsのデフォルトパスをlibsに変更し、buildを直接変更する.gradle

  •  android {
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
    }
  • javaファイルロードパッケージ
  • 
    private void load() {
           try {
               System.loadLibrary("xxxxx");
    
           } catch (Throwable e) {
               Log.d("zzzzz","  xx    :"+e.toString());
           }
     }

    もう1つは、適合機種が使用する各cpuの下に1つを加えることである.soパッケージ
                      |---arm64-v8a
                             |---xxxxx.so
                      |---armeabi
                             |---xxxxx.so
                      |---armeabi-v7a
                             |---xxxxx.so
                      |---x86
                             |---xxxxx.so
                      |---x86_64
                             |---xxxxx.so
                      |---mips
                             |---xxxxx.so
                      |---mips64
                             |---xxxxx.so