0

私は 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 メソッドが呼び出されていることを確認しました。そして、テキスト フィールドは明らかに作成され、保持されています。そのテキストを確認して操作できます。コードの観点からは、すべて問題ないように見えます。画面に映らないだけです。

誰でも理由がわかりますか?

4

0 に答える 0