我正在尝试使用 android studio 中的 Smack 库构建一个带有 XMPP 协议(protocol)的聊天应用程序。 通过使用 Smack 版本 3.1.0,我可以轻松连接到 Open Fire 服务器,甚至我向通过 Spark 登录的用户发送了一条消息。但我永远无法收到来自该用户的消息,因为 MessageListener 的 processMessage 在编译时只运行了一次。因为我无法获得最喜欢的结果,所以我在互联网上搜索并发现 smack 来自版本 4.1 或更高版本,仅支持 android。
所以我尝试使用 smack 4.1.4 构建我的应用程序并解决了许多错误。 但有一个错误没有解决,我无法在互联网上找到它。 就是这样(当然还有更多的错误,但我带来了前 4 个):
11-10 00:16:03.446 15512-15539/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
11-10 00:41:36.169 19859-19886/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime: at org.jivesoftware.smack.util.dns.javax.JavaxResolver.<clinit>(JavaxResolver.java:50)
11-10 00:41:36.169 19859-19886/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime: at java.lang.Class.classForName(Native Method)
11-10 00:41:36.169 19859-19886/xmppconnectiontest2.ffisher.com.xmpp2 E/AndroidRuntime: at java.lang.Class.forName(Class.java:308)
正如 igniterealtime 的文档所说,我添加了所有必要的库。 这是我在 Gradle 中的依赖项:
compile 'org.igniterealtime.smack:smack-core:4.1.4'
compile 'org.igniterealtime.smack:smack-tcp:4.1.4'
compile 'org.igniterealtime.smack:smack-extensions:4.1.4'
compile 'org.igniterealtime.smack:smack-resolver-javax:4.1.4'
compile 'org.igniterealtime.smack:smack-bosh:4.1.4'
compile 'org.igniterealtime.smack:smack-resolver-dnsjava:4.1.4'
compile 'org.igniterealtime.smack:smack-legacy:4.1.4'
compile 'org.igniterealtime.smack:smack-experimental:4.1.4'
compile 'org.igniterealtime.smack:smack-jingle-old:4.1.4'
compile 'org.igniterealtime.smack:smack-debug:4.1.4'
创建时的主要 Activity :
Thread t = new Thread(new Runnable() {
@Override
public void run() {
String [] param = {"mhs", "10.0.2.2"};
Asynchron asynchron = (Asynchron) new Asynchron();
asynchron.doInBackground(param);
}
});
t.start();
我使用的 AsyncTask 的子类:
public class Asynchron extends AsyncTask <String, Void, Void>
{
@Override
protected Void doInBackground(String... params) {
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setServiceName(params[0]);
builder.setHost(params[1]);
builder.setPort(5222);
builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
builder.setDebuggerEnabled(true);
builder.setCompressionEnabled(true);
connection = new XMPPTCPConnection(builder.build());
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
try {
connection.connect();
connection.login("testUser1", "1234");
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
}
return null;
}
}
我真的需要你的帮助。 如何解决我在问题标题中写的错误?
最佳答案
只需使用:
compile "org.igniterealtime.smack:smack-android-extensions:4.1.0"
compile "org.igniterealtime.smack:smack-experimental:4.1.0"
compile "org.igniterealtime.smack:smack-tcp:4.1.0"
并删除 builder.setCompressionEnabled(true);
关于java.lang.NoClassDefFoundError : Failed resolution of: Ljavax/naming/directory/InitialDirContext; 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33618432/