6

当我尝试为我的 VpnService 创建隧道接口时,我收到以下错误:

Attempt to invoke virtual method 'java.lang.String android.os.ParcelFileDescriptor.toString()' on a null object reference

我目前唯一的解决办法是在发生这种情况时重新启动设备。如果我不这样做,我根本无法创建隧道。

我创建隧道的代码:

// This is inside my VpnService implementation 

private ParcelFileDescriptor configureTunnelWithPushOpts(PushOpts popts)
{
    VpnService.Builder builder = this.new Builder();

    builder.setMtu       ( currentServerPrefs.SERVER_MTU );
    builder.addAddress   ( popts.ip, 32                  );
    builder.addDnsServer ( popts.dns1                    );
    builder.addDnsServer ( popts.dns2                    );
    builder.addRoute     ( "0.0.0.0", 0                  );


    // Note: Blocking mode is now enabled in native
    // code under the setFileDescriptor function.
    // builder.setBlocking(true);

    builder.setConfigureIntent(
            PendingIntent.getActivity(
                    this,
                    0,
                    new Intent(
                            this,
                            MainActivity.class
                    ),
            PendingIntent.FLAG_UPDATE_CURRENT)
    );

    final ParcelFileDescriptor vpnInterface;

    synchronized (this) {
        builder.setSession(currentServerPrefs.SERVER_ADDRESS);
        vpnInterface = builder.establish();
    }

    Logger.info("New interface: " + vpnInterface.toString(), this);
    return vpnInterface;
}

编辑:

根据文档,如果 VpnService 尚未准备好,该establish函数将返回,但是我在运行上述函数之前使用它来准备它。null

// This is inside my MainActivity class

Intent intent = VpnService.prepare(getApplicationContext());
if (intent != null) {
    startActivityForResult(intent, 0);
} else {
    onActivityResult(0, RESULT_OK, null);
}

. . . 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Intent intent = new Intent(this, MyVpnService.class);
        startService(intent);
    }
}

我用于调试的电话

Google Nexus 5 Running Android 5.0.1

编辑

我想出了如何复制它,这样它就不再是零星的了。基本上,如果我在连接 VPN 时卸载应用程序,然后重新安装它并尝试重新启动它,我会在运行时收到空响应builder.establish()。我担心当应用程序通过 Google Play 商店更新时,这可能会带来潜在的问题。

除此之外,请不要将此问题标记为重复。关于这个问题的所有其他问题都得到了答案,即在建立构建器之前需要准备服务,但是我正在准备它,并且我的问题有不同的原因。任何帮助,将不胜感激。

4

1 回答 1

3

非常感谢您的提示,它使我找到了解决方案!

我在 Android 5.0.2 中遇到了同样的问题:一切正常,我安装了我正在开发的 vpn 应用程序。第二天,突然,一个无法解决的NullPointerException,虽然prepare被恰当地调用了。

这个问题可以通过以下步骤在我的环境中解决:

  • 卸载应用程序。应用程序是否仍然具有有效的 VPN 功能并不重要。
  • 重启手机。确保它已完全关闭。
  • 重新启动后,确保不再安装该应用程序(我遇到了一些奇怪的开发问题,即重新启动手机后重新安装了一个应用程序)。
  • 再次安装您的 VPN 应用程序。它现在应该接收一个 vpn 接口,而不是现在null
于 2018-04-14T16:34:37.483 回答