Android使用JNI,C++调用JAVA代码,能找到JAVA的函数无法调用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android使用JNI,C++调用JAVA代码,能找到JAVA的函数无法调用?相关的知识,希望对你有一定的参考价值。
根据打印的结果来看,找到了test这个函数,调用的时候程序崩溃了。
好像是CallStaticobjectMethod 和 CallVoidMethod 接口android没有具体实现,可以看看头文件方法上面的注释, 参考技术A 应该是缺少log的依赖包追问我的LOG都打印出来还会缺失包???
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使用JNI,C++调用JAVA代码,能找到JAVA的函数无法调用?的主要内容,如果未能解决你的问题,请参考以下文章
Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)
使用 Qt/C++ 通过 JNI 调用 Java 代码。 FindClass 找不到类
Android项目中JNI技术生成并调用.so动态库实现详解