我有一个基于 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 方法。并且文本字段显然正在制作并持续存在 - 我可以检查和操作它的文本,从代码的角度来看,一切看起来都很好。它只是没有出现在屏幕上。
有人知道为什么吗?