Reputation: 557
An external jar file when used with normal Java application works fine, but when I use the same .jar file in android after putting in the /libs folder throws exceptions. The jar basically does encryption of values provided in a Map. The error log is as follows:
12-24 20:36:45.441: E/EncryptionUtils(31893): Could not read 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): at 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): FATAL EXCEPTION: main 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): at 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): Caused by: 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 more
Please point out where am I going wrong...
Upvotes: 0
Views: 207
Reputation: 267
The library you are trying to use is not meant for android.
For android, please use the jar from https://developers.ipayy.com/making-a-payment-android This jar is optimized for android and has additional functionality to auto read the OTP (provide you have permissions in AndroidManifest.xml).
Upvotes: 1
Reputation: 16363
Look, Android uses slightly different virtual machine (Dalvik) which uses different bytecode format than usual Sun's (Oracle's) bytecode. In practice that means that before packing into final APK original Sun's jar library should be translated to Dalvik's bytecodes. If jar contains nothing unusual (like references to unknown libraries or to native code) - it works fine. But not in your case.
Looks like that your jar uses some code which is unavailable under Android - most likely it's Sun's specific java.security package.
Here's prooflink which shows that in Android there's no such class as java.security.NoSuchProviderException
Upvotes: 1