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

我需要从Java代码调用外部DLL库函数。 我使用Netbeans 7.2。 我的DLL的功能是:

Boolean  isValid(string  word)
List<String> getWords(String  word)

我正在关注这个例子。 但我不知道如何声明我的dll函数。 我找到了另一个链接。 但它不适合我。


我偶然发现了“从Java调用DLL”的相同问题,并首先对复杂性感到沮丧。 然而,有一个优雅的解决方案(对于那些处于加工站的生境中的人来说也可能是有趣的。)考虑到这个问题相当“一般”的形式(或许降价不合理),我想,将指出一个相当容易的解决方案。 换句话说,这个解决方案避免了使用头文件混乱aronud,额外的转换等等,就像源代码不一定可用一样。

我的建议是JNA(https://github.com/twall/jna),它基本上是JNI的简化包装。 它工作的很好,类型映射是直截了当的(例如,pchar = lpcstr buffer - > string),尽管我只将它用于Windows DLL和使用Delphi-Pascal创建的我自己的C风格的DLL。 唯一要考虑的是返回值应该通过函数输出,而不是“输出”标记的参考变量。 这个问题已经指出了一个链接的源代码,为此提供了一个例子(所以,JNI周围的答案可能会在这里错位)。 请注意,我提供的链接还包含用于传输数组和指针的axamples。


您将需要使用Java Native Interface(JNI),它是一组允许本地代码与java代码接口(即从java函数调用接收参数,返回结果等)的C / C ++函数。 编写一个接收JNI调用的包装器C库,然后调用你的外部库。

例如,下面的函数调用本地对象上的方法updateHandlers (它在Java端存储的时间很长)。

class MyImpl {
  void updateHandlers(JNIEnv *env) {
    this->contentHandler = ....;
  }
}

JNIEXPORT void JNICALL Java_package_Classname_updateHandlers0
  (JNIEnv *env, jobject obj, jlong ptr) 
{
  ((MyImpl*)ptr)->updateHandlers(env);
}

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
}

我前段时间写过示例教程,也许它会有所帮助。

http://wendro.blogspot.com/2010/03/jni-example-eclipse-dev-cpp.html

链接地址: http://www.djcxy.com/p/96835.html

上一篇: How to call external dll function from java code

下一篇: How to get NDK debugging to work in Android Studio?