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

问题描述 投票:2回答:1

正如标题所示,如果函数来自不同的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()。这该怎么做?

android java-native-interface jnienv
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.