与普通Java应用程序一起使用时,外部jar文件工作正常,但是当我在/ libs文件夹中使用相同的.jar文件后抛出异常。 jar基本上对Map中提供的值进行加密。 错误日志如下:
12-24 20:36:45.441:E / EncryptionUtils(31893):无法读取PublicKey 12-24 20:36:45.441:E / EncryptionUtils(31893):java.security.NoSuchProviderException:SunRsaSign 12-24 20:36:45.441:E / EncryptionUtils(31893):at> java.security.KeyFactory.getInstance(KeyFactory.java:108) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> in.verse.ipayy.crypto.EncryptionUtils.getPublicKey(Unknown Source) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> in.verse.ipayy.crypto.CryptoUtils.loadGlobalPublicKey(Unknown Source) 12-24 20:36:45.441:E / EncryptionUtils(31893):at in.verse.ipayy.crypto.CryptoUtils。(Unknown> Source) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> com.example.testencryption.Encryption.encrypt(Encryption.java:30) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> com.example.testencryption.MainActivity.onCreate(MainActivity.java:16) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.Activity.performCreate(Activity.java:5138) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2228) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2314) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.ActivityThread.access $ 600(ActivityThread.java:144) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1317) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.os.Handler.dispatchMessage(Handler.java:99) 12-24 20:36:45.441:E / EncryptionUtils(31893):在android.os.Looper.loop(Looper.java:150) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> android.app.ActivityThread.main(ActivityThread.java:5147) 12-24 20:36:45.441:E / EncryptionUtils(31893):at java.lang.reflect.Method.invokeNative(Native> Method) 12-24 20:36:45.441:E / EncryptionUtils(31893):at java.lang.reflect.Method.invoke(Method.java:511) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 12-24 20:36:45.441:E / EncryptionUtils(31893):at> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 12-24 20:36:45.441:E / EncryptionUtils(31893):at dalvik.system.NativeStart.main(Native Method) 12-24 20:36:45.451:E / AndroidRuntime(31893):致命异常:主要 12-24 20:36:45.451:E / AndroidRuntime(31893):java.lang.ExceptionInInitializerError 12-24 20:36:45.451:E / AndroidRuntime(31893):at> com.example.testencryption.Encryption.encrypt(Encryption.java:30) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> com.example.testencryption.MainActivity.onCreate(MainActivity.java:16) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.Activity.performCreate(Activity.java:5138) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2228) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2314) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.ActivityThread.access $ 600(ActivityThread.java:144) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1317) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.os.Handler.dispatchMessage(Handler.java:99) 12-24 20:36:45.451:E / AndroidRuntime(31893):在android.os.Looper.loop(Looper.java:150) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> android.app.ActivityThread.main(ActivityThread.java:5147) 12-24 20:36:45.451:E / AndroidRuntime(31893):at java.lang.reflect.Method.invokeNative(Native> Method) 12-24 20:36:45.451:E / AndroidRuntime(31893):at java.lang.reflect.Method.invoke(Method.java:511) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 12-24 20:36:45.451:E / AndroidRuntime(31893):at> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 12-24 20:36:45.451:E / AndroidRuntime(31893):at dalvik.system.NativeStart.main(Native Method) 12-24 20:36:45.451:E / AndroidRuntime(31893):引起:java.lang.NullPointerException 12-24 20:36:45.451:E / AndroidRuntime(31893):at> in.verse.ipayy.crypto.CryptoUtils.loadGlobalPublicKey(Unknown Source) 12-24 20:36:45.451:E / AndroidRuntime(31893):at in.verse.ipayy.crypto.CryptoUtils。(Unknown> Source) 12-24 20:36:45.451:E / AndroidRuntime(31893):... 16更多
请指出我哪里出错...
答案 0 :(得分:1)
看,Android使用略有不同的虚拟机(Dalvik),它使用与通常的Sun(Oracle)字节码不同的字节码格式。在实践中,这意味着在打包到最终APK原始之前,Sun的jar库应该被翻译成Dalvik的字节码。如果jar没有任何异常(比如对未知库或本机代码的引用) - 它工作正常。但不是你的情况。
看起来你的jar使用的是Android下不可用的代码 - 很可能是Sun特有的java.security包。
以下是prooflink,其中显示在Android中没有java.security.NoSuchProviderException
这样的课程
答案 1 :(得分:1)
您尝试使用的库不适用于Android。
对于android,请使用https://developers.ipayy.com/making-a-payment-android中的jar 这个jar针对android进行了优化,并具有自动读取OTP的附加功能(在AndroidManifest.xml中提供您的权限)。