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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android在C ++ JNI代码中从另一个活动类调用Java函数相关的知识,希望对你有一定的参考价值。

正如标题所示,如果函数来自不同的java活动类,如何从C++调用Java函数?

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

这是类的示例布局

活动类

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

          JNIAdapter.launch(); 
      }

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

JNIAdapter.class

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

     public static native void launch();
}

jnisample.cpp

extern "C"
JNIEXPORT void JNICALL
Java_com_JNIAdapter_launch(JNIEnv *env,jobject object)
{
       jclass dataClass = env->FindClass("com/game/ramo/MainActivity");
       jmethodID javaMethodRef = env->GetMethodID(dataClass, "DisplayLoginDialog", "()V");
       env->CallVoidMethod(object, javaMethodRef);
}

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

答案

你的小例子(我明白你减少了与特定问题无关的所有细节,这非常好!)可以在没有本地方法的情况下运行。 JNIAdaptor.launch()可能是纯Java。所以,首先,用Java重写它并确保它有效。

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

之后,您编写的JNI代码应该没有问题。

以上是关于Android在C ++ JNI代码中从另一个活动类调用Java函数的主要内容,如果未能解决你的问题,请参考以下文章

从另一个库调用一个库函数

如何在 Android 中从另一个应用程序启动 Activity

在android中从另一个片段获取数据到片段

在c ++中从另一个进程中解锁线程

Android Kotlin 无法从另一个活动中获取结果

在 PCL 中从另一个点云中删除点?