私は NativeInterface に基づいたアプリを持っているので、主に C++ で書かれています。ただし、画面に標準の UI 要素をいくつか表示したいので、呼び出されたときに画面に UI を表示するメソッドを使用して、小さな Java クラスを作成しました。このようにして、何かを画面に表示したいときに、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 メソッドが呼び出されていることを確認しました。そして、テキスト フィールドは明らかに作成され、保持されています。そのテキストを確認して操作できます。コードの観点からは、すべて問題ないように見えます。画面に映らないだけです。
誰でも理由がわかりますか?