C++ JNI如何调用C/C++;C/C+中的函数+;?

C++ JNI如何调用C/C++;C/C+中的函数+;?,c++,c,java-native-interface,C++,C,Java Native Interface,在搜索JNI时,我总是发现如下内容: 方法,在Java中调用 方法,在C/C中调用++ 但决不要使用C/C++中的方法,而是使用JNI调用C/C++中的方法 我这样问是因为我有一个第三方Java库,它有一些C/C++库,我总是用Java来调用它们。现在,我想用C而不是Java来创建一些程序。不幸的是,它们不提供C/C++中的任何API,只提供Java中的API 有可能吗?如果有,我怎么做 提前谢谢你 JNI方法总是使用外部C签名公开 这意味着,如果您有方法签名,您可以直接链接到JNIDLL。

在搜索JNI时,我总是发现如下内容:

  • 方法,在Java中调用
  • 方法,在C/C中调用++
但决不要使用C/C++中的方法,而是使用JNI调用C/C++中的方法

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

有可能吗?如果有,我怎么做


提前谢谢你

JNI方法总是使用外部C签名公开

这意味着,如果您有方法签名,您可以直接链接到JNIDLL。(如果您查看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);

JNI方法总是使用外部C签名公开

这意味着,如果您有方法签名,您可以直接链接到JNIDLL。(如果您查看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);

从C/C++调用现有的C/C++方法只需包含正确的头文件,并确保在编译C/C++组件时有可链接的源文件或二进制文件即可。您可以使用JNI调用自定义Java方法,然后JNI将其返回到第三方库中的C/C++中,但如果库没有公开未编译的头,则可能不打算访问它。不打算访问它。。。我希望有一些方法在C/C++中是“100%”,而不是希望通过Java中的方法回到C/C++中。这太傻了。我将与第三方开发人员一起检查是否有办法获得一些C/C++API…从C/C++调用现有的C/C++方法只是包括正确的头文件,并确保在编译C/C++组件时有可链接的源代码或二进制文件。您可以使用JNI调用自定义Java方法,然后JNI将其返回到第三方库中的C/C++中,但如果库没有公开未编译的头,则可能不打算访问它。不打算访问它。。。我希望有一些方法在C/C++中是“100%”,而不是希望通过Java中的方法回到C/C++中。这太傻了。我将与第三方开发人员一起检查是否有办法获得一些C/C++API…从C/C++调用现有的C/C++方法只是包括正确的头文件,并确保在编译C/C++组件时有可链接的源代码或二进制文件。您可以使用JNI调用自定义Java方法,然后JNI将其返回到第三方库中的C/C++中,但如果库没有公开未编译的头,则可能不打算访问它。不打算访问它。。。我希望有一些方法在C/C++中是“100%”,而不是希望通过Java中的方法回到C/C++中。这太傻了。我将与第三方开发人员一起检查是否有办法获得一些C/C++API。。。