我正在开发一个概念项目。
我有一个服务器和客户端,两者都是用 Kryonet TCP/UDP 库实现的。它在我的计算机上作为纯 Java 运行良好,但是当我尝试在 Android 上执行一些代码时,它给出以下内容
LogCat 输出:
07-18 15:35:40.718: E/AndroidRuntime(19229): FATAL EXCEPTION: main
07-18 15:35:40.718: E/AndroidRuntime(19229): Process: com.example.kryoandrochat, PID: 19229
07-18 15:35:40.718: E/AndroidRuntime(19229): java.lang.NoClassDefFoundError: sun.security.rsa.RSAPublicKeyImpl
07-18 15:35:40.718: E/AndroidRuntime(19229): at com.example.kryoandrochat.MainActivity.onClick(MainActivity.java:133)
07-18 15:35:40.718: E/AndroidRuntime(19229): at android.view.View.performClick(View.java:4626)
07-18 15:35:40.718: E/AndroidRuntime(19229): at android.view.View$PerformClick.run(View.java:19300)
07-18 15:35:40.718: E/AndroidRuntime(19229): at android.os.Handler.handleCallback(Handler.java:733)
07-18 15:35:40.718: E/AndroidRuntime(19229): at android.os.Handler.dispatchMessage(Handler.java:95)
07-18 15:35:40.718: E/AndroidRuntime(19229): at android.os.Looper.loop(Looper.java:157)
07-18 15:35:40.718: E/AndroidRuntime(19229): at android.app.ActivityThread.main(ActivityThread.java:5293)
07-18 15:35:40.718: E/AndroidRuntime(19229): at java.lang.reflect.Method.invokeNative(Native Method)
07-18 15:35:40.718: E/AndroidRuntime(19229): at java.lang.reflect.Method.invoke(Method.java:515)
07-18 15:35:40.718: E/AndroidRuntime(19229): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
07-18 15:35:40.718: E/AndroidRuntime(19229): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
07-18 15:35:40.718: E/AndroidRuntime(19229): at dalvik.system.NativeStart.main(Native Method)
我在我的项目中包含了 JRE 系统库,但没有任何改变。
这是客户端代码:
package com.example.kryoandrochat;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import sun.security.rsa.RSAPublicKeyImpl;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
public class MainActivity extends Activity implements OnClickListener{
private Client client;
private TextView tv;
private EditText et;
private Button send;
private PublicKey publicKey, targetsPublicKey;
private String targetUserName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.chatTextView);
et = (EditText) findViewById(R.id.chatField);
send = (Button) findViewById(R.id.send);
send.setOnClickListener(this);
client = new Client();
new NetworkTask().execute("");
client.addListener(new Listener(){
public void received (Connection connection, Object object) {
if(object instanceof ClientConnectedPacket){
ClientConnectedPacket ccp = (ClientConnectedPacket) object;
tv.setText(ccp.userName + " is online now. \n");
PublicKeyPacket pkp = new PublicKeyPacket();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(((RSAPublicKeyImpl) publicKey).getModulus().toString());
stringBuilder.append("|");
stringBuilder.append(((RSAPublicKeyImpl) publicKey).getPublicExponent().toString());
String serPK = stringBuilder.toString();
pkp.publicKey = serPK;
pkp.targetUserName = targetUserName;
client.sendTCP(pkp);
}
}
});
}
private class NetworkTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
client.connect(10000, "myHostIP", 27960, 8008);
new Thread(client).start();
} catch (IOException e) {
e.printStackTrace();
System.out.println("Baglanamadik.");
}
new Thread(client).start();
return "Connected";
}
@Override
protected void onPostExecute(String result) {
tv.setText("We are connected");
}
@Override
protected void onPreExecute() {
client.getKryo().register(ChatPacket.class);
client.getKryo().register(ClientConnectedPacket.class);
client.getKryo().register(UserConnectedPacket.class);
client.getKryo().register(UserDisconnectedPacket.class);
client.getKryo().register(KeyPairGenerator.class);
client.getKryo().register(KeyPair.class);
client.getKryo().register(PublicKey.class);
client.getKryo().register(PrivateKey.class);
client.getKryo().register(PublicKeyPacket.class);
//client.getKryo().register(sun.security.rsa.RSAPublicKeyImpl.class);
//client.getKryo().register(sun.security.x509.AlgorithmId.class);
//client.getKryo().register(sun.security.util.ObjectIdentifier.class);
client.getKryo().register(byte[].class);
client.getKryo().register(java.math.BigInteger.class);
}
@Override
protected void onProgressUpdate(Void... values) {}
}
@Override
public void onClick(View v) {
if (v == send){
String temp = "";
temp = et.getText().toString();
if (!temp.equals("")){
ChatPacket c = new ChatPacket();
c.userName = "user3";
c.targetUserName = targetUserName;
PublicKeyPacket pkp = new PublicKeyPacket();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(((RSAPublicKeyImpl) publicKey).getModulus().toString());
stringBuilder.append("|");
stringBuilder.append(((RSAPublicKeyImpl) publicKey).getPublicExponent().toString());
String serPK = stringBuilder.toString();
pkp.publicKey = serPK;
pkp.userName = "user3";
pkp.targetUserName = targetUserName;
client.sendTCP(pkp);
/*try {
c.message = encryptData(temp);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/
client.sendTCP(c);
}
}
}
}
最佳答案
导入 sun.security.rsa.RSAPublicKeyImpl;
这显然是无稽之谈。 Android上没有这样的类;这意味着你不能使用它。 Oracle(以前是 Sun)Java 中可能有这样的类,但您的代码不应该显式引用它。
关于java - Android NoClassDefFoundError - RSA 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24825439/