在android中使用海绵城堡

时间:2013-11-21 04:15:20

标签: java android bouncycastle

嘿,我是java和android的新手。尝试与海绵城堡一起锻炼,但有一些问题。我在帖子this中尝试了解决方案,但仍然遇到运行时错误“应用程序意外停止。请再试一次。”

以下是代码:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

import org.spongycastle.jce.provider.BouncyCastleProvider;

public class MainActivity extends Activity {

static {
    //Security.addProvider(new BouncyCastleProvider());
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    }

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button generator= (Button) findViewById(R.id.key_pair_generator);
    generator.setOnClickListener(ECkeyPairGenerator);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

 private Button.OnClickListener ECkeyPairGenerator = new Button.OnClickListener()
    {
        public void onClick(View v) {
            try {
                ECGenParameterSpec ecParamSpec = new ECGenParameterSpec("secp224k1");
                KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDH","SC");// KeyPairGenerator.getInstance("ECDH","SC");
                kpg.initialize(ecParamSpec);

                KeyPair kpair=kpg.generateKeyPair();
                PublicKey pkey = kpair.getPublic();
                PrivateKey skey = kpair.getPrivate();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
           }
    };

}

当我运行调试器时,它会在语句处停止:“Security.insertProviderAt(new BouncyCastleProvider(),1);”通过给出以下错误。

Construct a new provider. This should only be required when using runtime registration of the provider using the Security.addProvider() mechanism.

我在JDK中添加了提供程序但仍然没有用。请帮帮我?

这是logcat:

11-22 18:07:21.744: E/dalvikvm(572): Could not find class 'org.spongycastle.jce.provider.BouncyCastleProvider', referenced from method com.example.testrsakeygeneration.MainActivity.<clinit>
11-22 18:07:21.804: W/dalvikvm(572): VFY: unable to resolve new-instance 639 (Lorg/spongycastle/jce/provider/BouncyCastleProvider;) in Lcom/example/testrsakeygeneration/MainActivity;
11-22 18:07:21.804: D/dalvikvm(572): VFY: replacing opcode 0x22 at 0x0000
11-22 18:07:21.804: D/dalvikvm(572): VFY: dead code 0x0002-0009 in Lcom/example/testrsakeygeneration/MainActivity;.<clinit> ()V
11-22 18:07:21.834: W/dalvikvm(572): Exception Ljava/lang/NoClassDefFoundError; thrown during Lcom/example/testrsakeygeneration/MainActivity;.<clinit>
11-22 18:07:21.855: W/dalvikvm(572): Class init failed in newInstance call (Lcom/example/testrsakeygeneration/MainActivity;)
11-22 18:07:21.864: D/AndroidRuntime(572): Shutting down VM
11-22 18:07:21.864: W/dalvikvm(572): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
11-22 18:07:21.934: E/AndroidRuntime(572): FATAL EXCEPTION: main
11-22 18:07:21.934: E/AndroidRuntime(572): java.lang.ExceptionInInitializerError
11-22 18:07:21.934: E/AndroidRuntime(572):  at java.lang.Class.newInstanceImpl(Native Method)
11-22 18:07:21.934: E/AndroidRuntime(572):  at java.lang.Class.newInstance(Class.java:1429)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 18:07:21.934: E/AndroidRuntime(572):  at android.os.Looper.loop(Looper.java:123)
11-22 18:07:21.934: E/AndroidRuntime(572): at android.app.ActivityThread.main(ActivityThread.java:4627)
11-22 18:07:21.934: E/AndroidRuntime(572): at java.lang.reflect.Method.invokeNative(Native Method)
11-22 18:07:21.934: E/AndroidRuntime(572):  at java.lang.reflect.Method.invoke(Method.java:521)
11-22 18:07:21.934: E/AndroidRuntime(572):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-22 18:07:21.934: E/AndroidRuntime(572):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-22 18:07:21.934: E/AndroidRuntime(572):  at dalvik.system.NativeStart.main(Native Method)
11-22 18:07:21.934: E/AndroidRuntime(572): Caused by: java.lang.NoClassDefFoundError: org.spongycastle.jce.provider.BouncyCastleProvider
11-22 18:07:21.934: E/AndroidRuntime(572):  at com.example.testrsakeygeneration.MainActivity.<clinit>(MainActivity.java:22)
11-22 18:07:21.934: E/AndroidRuntime(572):  ... 15 more

1 个答案:

答案 0 :(得分:5)

除了将库添加到Eclipse的Build Path之外,您还需要导出它们,以便它们包含在您的应用程序中。转到项目的属性,选择Java Build Path,选择Order and Export标签,并确保选中了库。