JNI 如何在 C/C++ 中调用 C/C++ 函数
JNI how to call a C/C++ function in C/C++?
搜索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);
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用