不久前遇到一个问题,编译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,问题解决。