Java 我可以把JNA和JNI混合在一起吗
我有一个使用JNA从Java访问的自定义dll。到目前为止,一切都很顺利。然而,现在我想从我的C代码中创建Java类。我假设这不能用JNA来完成,所以我所做的是创建一个JNI方法,但这导致了不满意的LinkError。因此,我的问题是:在访问同一个DLL时,我可以混合使用JNA和JNI吗?如果可以,我应该如何操作?当然可以混合访问DLL,因为它只加载一次。问题在于链接到应用程序的方式: JNA: 当使用JNA时,您调用JNA库的本机函数,它通过某种反射绑定到DLL中的函数。这样做的好处是,您不必担心DLL中函数的名称,它们不必满足任何约定 JNI: Simple通过将java类映射到DLL中预期的方法名称来工作。如果您有一个类Java 我可以把JNA和JNI混合在一起吗,java,java-native-interface,jna,Java,Java Native Interface,Jna,我有一个使用JNA从Java访问的自定义dll。到目前为止,一切都很顺利。然而,现在我想从我的C代码中创建Java类。我假设这不能用JNA来完成,所以我所做的是创建一个JNI方法,但这导致了不满意的LinkError。因此,我的问题是:在访问同一个DLL时,我可以混合使用JNA和JNI吗?如果可以,我应该如何操作?当然可以混合访问DLL,因为它只加载一次。问题在于链接到应用程序的方式: JNA: 当使用JNA时,您调用JNA库的本机函数,它通过某种反射绑定到DLL中的函数。这样做的好处是,您不必
com.company.SomeClass
包含带有此签名的函数int doStuff(int i,long john)
:
JNIEXPORT jint JNICALL Java_SomeClass_doStuff(JNIEnv *env, jint i, jlong john) {
return ...whatever...
}
如果缺少此函数,则会出现UnsatifiedLinkException
解决方案:
既然您似乎已经编写了自己的DLL,只需添加所需的函数作为包装函数,就完成了。要获取函数签名,可以使用javah
命令自动创建头文件
我推荐阅读。我想补充一件事。不要忘记每个JNIEXPORT的外部“C”以及JNA的函数 举个简单的例子:
// Example DLL header file MyDLL.dll
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
extern "C" {
MYDLL_API void HelloWorld(void);
}
extern "C" {
JNIEXPORT void JNICALL Java_MyJavaMain_HelloWorld(void);
}
//Example CPP file MyDLL.cpp
#include "MyDLL.h"
#include "stdio.h"
extern "C" declspec(dllexport)
void HelloWorld(void){
printf("Hello World From Dll");
}
也许另一种方法是用不透明指针包装类调用(比如:)我基本上按照您描述的做了,一定是做错了什么,我会再次检查,谢谢。