外部jar文件使用java应用程序但不在android应用程序中

时间:2013-12-24 14:08:30

标签: java android eclipse

与普通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更多

请指出我哪里出错...

2 个答案:

答案 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中提供您的权限)。