不久前遇到一個問題,編譯framework的時候出現瞭如下異常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at org.conscrypt.NativeCryptoJni.init(NativeCryptoJni.java:25) at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:54) at org.conscrypt.OpenSSLBIOInputStream.<init>(OpenSSLBIOInputStream.java:34) at org.conscrypt.OpenSSLX509Certificate.fromX509PemInputStream(OpenSSLX509Certificate.java:119) at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:220) at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:216) at org.conscrypt.OpenSSLX509CertificateFactory$Parser.generateItem(OpenSSLX509CertificateFactory.java:94) at org.conscrypt.OpenSSLX509CertificateFactory.engineGenerateCertificate(OpenSSLX509CertificateFactory.java:272) at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339) at com.android.signapk.SignApk.readPublicKey(SignApk.java:182) at com.android.signapk.SignApk.main(SignApk.java:1087) ninja: build stopped: subcommand failed. build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed make: *** [ninja_wrapper] Error 1
大意是說java.library.path
找不到conscrypt_openjdk_jni
這個so。
網上有很多解決方案,都是說怎麼對apk進行簽名。編譯整機framework的過程中這些簽名的過程都是自動進行的,這個解決方案一開始就是錯的,害我花了不少時間,害人不淺。
一番谷歌之後,發現既然是java.library.path
找不到conscrypt_openjdk_jni
這個so文件,那麼理論上只需要在java.library.path
放入缺少的so即可。在終端執行以下命令:
java -XshowSettings:properties
查看java.library.path
具體路徑在哪裏:
java.library.path = /usr/local/lib
/usr/java/packages/lib/amd64
/usr/lib/x86_64-linux-gnu/jni
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/jni
/lib
/usr/lib
把so複製到/usr/local/lib
以及/usr/lib
這兩個路徑下,問題沒有解決。
推測是在編譯某個mk文件有問題,在編譯代碼的時候修改了java.library.path
的值。於是在代碼根目錄下執行mma -j4
重新編譯整機代碼後再編譯framework,問題解決。