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