Android使用C ++ JNI代码从另一个活动类调用Java函数

时间:2018-09-18 04:46:51

标签: android java-native-interface jnienv

如标题所示,如果函数来自不同的Java活动类,如何从 val txCommand = Command(TypeBContract.Commands.Create(), listOf(me.owningKey)) val txBuilder = TransactionBuilder(notary) .addInputState(typeARef) .addOutputState(outputState, TYPEB_CREATION_CONTRACT_ID) .addCommand(txCommand) 调用Java函数?

所有示例和教程都来回调用C++函数和Java,但是调用者是类,并且JNIEnv和jobject从Java到JNI传递。但是,如果需要调用的函数来自不同的Java活动类怎么办?这该怎么做?通过活动的“ this”无效

这是类的示例布局

活动课

C++

JNIAdapter.class

public class MainActivity extends Activity {
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);

          JNIAdapter.launch(); 
      }

      private void DisplayLoginDialog() 
      {
          //...
      }
}

jnisample.cpp

public class JNIAdapter {
    static {
       System.loadLibrary("jnisample-lib");
    }

     public static native void launch();
}

在上面的代码中,使用jobject引用了JNIAdapter类,而不是Activity,因此未调用DisplayLoginDialog()。 这该怎么做?

1 个答案:

答案 0 :(得分:1)

您的小例子(我知道您减少了与特定问题无关的所有细节,这非常好!)可以在没有 native 方法的情况下运行。 JNIAdaptor.launch()可以是纯Java。因此,首先,用Java重写它并确保它可以工作。

问题可能是 MainActivity.DisplayLoginDialog()可能期望其父活动处于前台或处于某些特定状态。这在纯Java中更容易修复。

在那之后,您编写的JNI代码应该可以正常运行。