JNI 如何在 C/C++ 中调用 C/C++ 函数

JNI how to call a C/C++ function in C/C++?

本文关键字:C++ 调用 函数 JNI      更新时间:2023-10-16

搜索JNI,我总是找到类似的东西:

  • C/C++ 中的方法,Java 中的调用
  • Java 中的方法,在 C/C++ 中调用

但永远不要在 C/C++ 中调用方法,使用 JNI 调用 C/C++。

我这么问,因为我有一个第三方Java库,它有一些C/C++库,我一直使用Java来调用它们。我现在想用C而不是Java创建一些程序。不幸的是,他们不提供C/C++中的任何API,仅在Java中提供。

是否有可能,如果是,我该如何尝试?

提前谢谢你!

JNI 方法总是使用 extern C 签名公开。

这意味着,如果您有方法签名,则可以直接链接到 JNI dll。(如果您查看 Java 类本机方法签名,则可以轻松获得)。

但是你必须确保你为方法提供了它期望的环境。
这意味着传递"this"对象和环境对象。
您必须确保类装入器对象中加载了正确的包。在大多数情况下,JNI 代码假设调用该方法的环境已经具有正确的类加载器(因为调用了 java 方法......

此外,JNI 代码可能认为本地引用会从堆栈中自动释放(这在本机线程中不会发生C++)。

无论如何,它看起来像这样:

//MyClass.java
class MyClass
{
 native void Blah();
}
//method signature, some header file:
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_MyClass_Blah
        (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif

//Call the function, C++ code

Java_MyClass_Blah(myEnv, myClassInstanve);