Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.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代码调用外部dll函数_Java_Dll_Call_Jna - Fatal编程技术网

如何从java代码调用外部dll函数

如何从java代码调用外部dll函数,java,dll,call,jna,Java,Dll,Call,Jna,我需要从Java代码调用外部DLL库函数。我使用netbeans7.2。 我的dll的函数是: Boolean isValid(string word) List<String> getWords(String word) 布尔值有效(字符串字) 列表getWords(字符串字) 我在举一个例子。但是我不知道如何声明我的dll函数。 我找到了另一个。但它对我不起作用。我确实在不久前编写了示例教程,也许它会有所帮助 您需要使用,这是一组C/C++函数,允许本机代码与java代

我需要从Java代码调用外部DLL库函数。我使用netbeans7.2。 我的dll的函数是:

Boolean  isValid(string  word)
List<String> getWords(String  word)
布尔值有效(字符串字)
列表getWords(字符串字)
我在举一个例子。但是我不知道如何声明我的dll函数。
我找到了另一个。但它对我不起作用。

我确实在不久前编写了示例教程,也许它会有所帮助

您需要使用,这是一组C/C++函数,允许本机代码与java代码交互(即从java函数调用接收参数、返回结果等)。编写一个包装器C库,接收JNI调用,然后调用外部库

例如,下面的函数调用本机对象上的方法
updatehandles
(该对象在Java端存储的时间尽可能长)

package.ClassName中的相应声明为:

private long ptr; //assigned from JNI
public void updateHandlers() {
   if (ptr==0) throw new NullPointerException(); 
   updateHandlers0(ptr);
}
private native void updateHandlers0(long ptr);

static {
    try {
          /*try preloading the library external.dll*/
      System.loadLibrary("external");
    } catch (UnsatisfiedLinkError e) {
      /*library will be resolved when loading myjni*/
    }
    System.loadLibrary("myjni"); //load myjni.dll
}

用java(
native private…
)声明本机函数,并带有所需的签名;然后运行
javah
(JDK提供的工具)以生成本机头。
列表
(由于类型擦除,实际上是一个
列表
)是本机代码中的
jobject

相应的C方法是:

JNIEXPORT jobject JNICALL package_Classname_getWords(JNIEnv *env, jobject jobj, jstring word)

我认为返回字符串数组
jobjectArray
,并根据返回的值用java实例化列表会更容易。请参阅。

我偶然发现了“从Java调用DLL”这一同样的问题,并首先对复杂性感到沮丧。然而,这里有一个优雅的解决方案(processing.org habitat中的人们可能也会感兴趣……) 考虑到这个问题的相当“一般”的形式(也许,下调评级是不合理的),我想,一个相当简单的解决方案会被提出。换句话说,这是一种解决方案,可以避免将aronud与头文件、额外转换等混淆,就像源代码不一定可用一样

我建议使用JNA(),它基本上是一个围绕JNI的简化包装器。它工作得很好,类型映射很简单(例如,pchar=lpcstr buffer->string),尽管我只对Windows DLL和我自己使用Delphi Pascal创建的C风格DLL使用它。唯一需要考虑的是返回值应该通过函数导出而不是“标记”引用变量。
这个问题已经指向一个链接源,它提供了一个例子(因此,关于JNI的答案可能放错了地方)。请注意,我提供的链接还包含用于传输数组和指针的axamples。

“它不适用于我”的信息远远不够,我们无法帮助您。你需要告诉我们你尝试了什么,结果是什么。请阅读什么不起作用?你能分享一些你尝试过的代码吗?对于Linux:这是一个只有链接的答案,一般来说是不可接受的。
JNIEXPORT jobject JNICALL package_Classname_getWords(JNIEnv *env, jobject jobj, jstring word)