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

标签 c++ c java-native-interface

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

  • C/C++方法,Java调用
  • Java方法,C/C++调用

但从不在 C/C++ 中调用方法,在 C/C++ 中使用 JNI 调用。

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

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

提前致谢!

最佳答案

JNI 方法始终使用外部 C 签名公开。

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

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

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

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

//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);

关于c++ - JNI如何在C/C++中调用C/C++函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870581/

相关文章:

C程序自动四舍五入

android - Android 权限是如何执行的?

c++ - 这个指令错了吗? (movabs %al,0xe400000000004049)

c++ - Embedding Lua : how to programatically save a script to a folder, 如何编译脚本?

c++ - 'reinterpret_cast' : cannot convert from 'overloaded-function' to 'intptr_t' with boost. dll

c++ - 运算符重载 >> 和私有(private)成员

c++ - 使线程循环 5 次迭代; pthreads、互斥量和信号量

c++ - 覆盖 Ctrl-C

java - 使用 JNI 从 C 调用 java 代码时发生内存泄漏

java - 如何在 jni 输入参数中返回 double[]