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函数的主要内容,如果未能解决你的问题,请参考以下文章