当我尝试为我的VpnService创建隧道接口(interface)时,出现以下错误:

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

最佳答案

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

我在Android 5.0.2中遇到了相同的问题:一切正常,并且安装了我正在开发的vpn应用。第二天,突然,无法解析的NullPointerException,尽管正确调用了prepare

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

  • 卸载应用程序。没关系,无论应用程序是否仍具有VPN功能。
  • 重新启动手机。确保已将其完全关闭。
  • 重新启动后,请确保不再安装该应用程序(重启手机后,我在安装应用程序时遇到了一些奇怪的开发问题)。
  • 再次安装您的VPN应用程序。它现在应该收到一个vpn接口(interface),不再是null
  • 09-25 21:58