Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以把JNA和JNI混合在一起吗_Java_Java Native Interface_Jna - Fatal编程技术网

Java 我可以把JNA和JNI混合在一起吗

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中的函数。这样做的好处是,您不必

我有一个使用JNA从Java访问的自定义dll。到目前为止,一切都很顺利。然而,现在我想从我的C代码中创建Java类。我假设这不能用JNA来完成,所以我所做的是创建一个JNI方法,但这导致了不满意的LinkError。因此,我的问题是:在访问同一个DLL时,我可以混合使用JNA和JNI吗?如果可以,我应该如何操作?

当然可以混合访问DLL,因为它只加载一次。问题在于链接到应用程序的方式:

JNA:

当使用JNA时,您调用JNA库的本机函数,它通过某种反射绑定到DLL中的函数。这样做的好处是,您不必担心DLL中函数的名称,它们不必满足任何约定

JNI:

Simple通过将java类映射到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");
}

也许另一种方法是用不透明指针包装类调用(比如:)我基本上按照您描述的做了,一定是做错了什么,我会再次检查,谢谢。