SmackInitialization:无法确定 Smack 版本

Posted

技术标签:

【中文标题】SmackInitialization:无法确定 Smack 版本【英文标题】:SmackInitialization: Could not determine Smack version 【发布时间】:2017-01-27 11:35:36 【问题描述】:

我正在为 Unity 制作一个 android 插件,我需要在 Unity 中集成 XMPP,所以首先我尝试创建 XMPP 的连接并发送和接收消息。 它在 android 中运行良好,我可以发送和接收消息 但是当我导出 .jar 文件并在 Unity 中使用时,我在创建连接时出现以下错误 p>

SmackInitialization: Could not determine Smack version
  java.lang.NullPointerException: lock == null
  at java.io.Reader.<init>(Reader.java:64)
  at java.io.InputStreamReader.<init>(InputStreamReader.java:122)
  at java.io.InputStreamReader.<init>(InputStreamReader.java:57)
  at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.java:61)
  at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96)
  at org.jivesoftware.smack.ConnectionConfiguration.<clinit>(ConnectionConfiguration.java:38)
  at com.arvaan.myplugins.ToastExample.connectXMPP(ToastExample.java:99)
  at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
  at com.unity3d.player.UnityPlayer.a(Unknown Source)
  at com.unity3d.player.UnityPlayer$b$1.handleMessage(Unknown Source)
  at android.os.Handler.dispatchMessage(Handler.java:98)
  at android.os.Looper.loop(Looper.java:234)
  at com.unity3d.player.UnityPlayer$b.run(Unknown Source)

我不知道 Smack 有什么问题,我是 Unity 新手,我知道如何在 Unity 中创建插件和调用方法,但不知道这里出了什么问题。

请检查代码:

public class ToastExample extends UnityPlayerActivity implements ConnectionListener, ChatManagerListener, RosterListener, PingFailedListener, StanzaListener, MessageListener, ChatMessageListener 

private static final String TAG = ToastExample.class.getSimpleName();
private AbstractXMPPConnection mConnection = null;
private ChatManager chatManager;
private Chat chat;
private Context context;
private String userName = "";
private String passWord = "";
private String objectName = "";
private static ToastExample instance;

public ToastExample() 
    this.instance = this;

public static ToastExample instance() 
    if (instance == null) 
        instance = new ToastExample();
    
    return instance;

public void setContext(Context context)  // This is also working fine
    Log.e(TAG, "setContext called");
    this.context = context;

public void showMessage(String message)  // I can able to see toast
    Toast.makeText(this.context, message, Toast.LENGTH_SHORT).show();


public void connectXMPP(String host, int port, String userName, String passWord) 
    Log.e(TAG, "_connectXMPP called");
    XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); // Here i got error
    configBuilder.setUsernameAndPassword(userName, passWord);
    ...............
    ...............

我在我的插件和 Unity 中使用下面的 .Jar 文件

smack-core-4.1.4.jar
smack-extensions-4.1.4.jar
smack-im-4.1.4.jar
smack-android-4.1.4.jar
smack-android-extensions-4.1.4.jar
smack-tcp-4.1.4.jar
jxmpp-util-cache-0.4.2.jar
jxmpp-core-0.4.2.jar
jxmpp-jid-0.4.2.jar
jxmpp-stringprep-libidn-0.4.2.jar
minidns-core-0.2.0.jar**

有人也遇到这个问题,但没有找到Check more

请帮我解决这个问题,在此先感谢。!!!

【问题讨论】:

【参考方案1】:

由于没有人在这里回答,我是如何在 4 天研发后解决的:

    请在您的应用中提取 Smack-core-4.1.1.jar 文件和过去的所有类。 还有另外 3 个文件:version、smack-config.xml、jul.properties,请将此文件粘贴到 app 内的 Assests 文件夹中。 在 Smack 包中有一个类:SmackInitialization.java,请替换下面的代码。 Code Here 完成后,请制作 .Jar 文件并在 Unity 中使用。Check Here

如果您遇到同样的错误,请告诉我,我很乐意随时为您提供任何解决方案。

谢谢

【讨论】:

嗨,我尝试了您的解决方案,但我不断收到错误(使用 dns 解析器)。您能否通过电子邮件向我发送您正在工作的基础项目(仅使用聊天库)?我真的很感激。谢谢。 gist.github.com/mmvlad/35f51f8c438651608350273437c1fc65 我在库中添加了 smack-resolver-minidns, minidns-core 但错误仍然存​​在 @VladyslavMelnychenko 如果您想获得帮助,您可以随时发布您自己的问题。如果您认为它相关,请链接到此答案。 您创建一个inputstream 来读取硬编码字符串字节,只是为了创建一个缓冲读取器来首先读取硬编码行以设置smackVersion。好的!您可以删除整个方法并硬编码smackVersion = "4.1.4 (4.1.4 2015-09-14)"

以上是关于SmackInitialization:无法确定 Smack 版本的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 无法确定任务 ':app:processDebugResources' 的依赖关系

无法确定字段“T_DATE”的类型。 warnings.warn("无法确定字段 '' 的类型。".format(bq_field.name))

无法确定发生重定向的位置

修复实体框架“无法确定关系...”的问题

无法单击网络警报中的“确定”按钮

popover箭头方向无法确定