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动态库实现详解

JNI和NDK编程

#yyds干货盘点#Android C++系列:JNI调用 Java 类的构造方法和父类的方法

JNI 通过多线程从 C++ 调用 Java