0

我有一个基于 NativeInterface 的应用程序,因此主要是用 C++ 编写的。不过,我希望在屏幕上有一些标准的 UI 元素,所以我编写了一个小型 java 类,其中包含在调用时应将 UI 放在屏幕上的方法。这样,当我想在屏幕上显示内容时,我可以通过 JNI 触发它。

这是功能:

public static void initLogWindow(Activity activity) {
  class RunnableSetupWindow implements Runnable {
    public Activity activity;
    @Override
    public void run() {
      LinearLayout linear_layout = new LinearLayout(activity);
      ScrollView scroll_view = new ScrollView(activity);
      TextView text_view = new TextView(activity);
      linear_layout.addView(scroll_view);
      scroll_view.addView(text_view);
      Window window = activity.getWindow();
      window.takeSurface(null);
      window.setContentView(linear_layout);
      LoggingUtils.text_view = text_view;

      text_view.setText("Hello world!");
    }
  }
  RunnableSetupWindow setup_window = new RunnableSetupWindow();
  text_view = null;
  setup_window.activity = activity;
  new Handler(Looper.getMainLooper()).post(setup_window);
}

但是,当我从 JNI 触发它时,屏幕上什么也没有显示。很让人心疼。如果我在函数中包含 Log 语句,它们会很好地打印到控制台,所以我知道它正在被调用。但它不会在设备的屏幕上放置任何东西。

奇怪的是,如果我将此代码剪切并粘贴到一个随机的空白项目中,它会做我想要的。出现文本框。很明显,这段代码能够在屏幕上创建文本字段。

如果我转到我的 C++ 代码,并用此方法中所有内容的 JNI 等效项替换我的 JNI 调用(调用此方法),那么它也可以工作。

我已经验证正在调用 java 方法。并且文本字段显然正在制作并持续存在 - 我可以检查和操作它的文本,从代码的角度来看,一切看起来都很好。它只是没有出现在屏幕上。

有人知道为什么吗?

4

0 回答 0