从Java中使用JNA调用DLL [英] Call DLL from Java using JNA

查看:861
本文介绍了从Java中使用JNA调用DLL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来使用JNA从Java访问的DLL。我需要一个DLL(.NET编写)内的类访问方法。构成本示例DLL下面,我试图让AuditID和服务器ID。我结束与下面的错误,而我正在我的code。任何指导真的AP preciated。

///错误///

 在线程异常主要java.lang.UnsatisfiedLinkError中:错误查找功能GetEnrollcontext:指定的程序无法找到。
 

// DLL文件code //

  SampleDLL.ProfileEnroll enrollcontext =新SampleDLL.ProfileEnroll();
enrollcontext.Url =URL;
enrollcontext.AuditIdType = SampleDLL.ProfileId;
enrollcontext.AuditId =22222222;
enrollcontext.ServerId =服务器1;
 

///的Java code ///

 进口com.sun.jna.Library;
进口com.sun.jna.Native;
进口com.sun.jna.Structure;
进口dllExtract.DLLExtractTest.SampleDLL.Enrollcontext;


公共类SampleDLLExtract {

    公共接口SampleDLL扩展库{
        SampleDLL INSTANCE =(SampleDLL)Native.loadLibrary(SampleDLL
            SampleDLL.class);

        公共静态类Enrollcontext扩展结构{

            公共字符串auditId;
            公共字符串服务器ID;
        }
            无效GetEnrollcontext(Enrollcontext EC); //无效();
    }
    公共静态无效的主要(字串[] args){
        SampleDLL SDLL = SampleDLL.INSTANCE;
        SampleDLL.Enrollcontext enrollContext =新SampleDLL.Enrollcontext();
        sdll.GetEnrollcontext(enrollContext);

        的System.out.println(sdll.toString(sdll.GetEnrollcontext(enrollContext)));
    }
}
 

解决方案

其实有一个解决方案,为您在Java中(而不是其他)使用C#,VB.NET和F#code通过JNA!而且它也很容易使用: https://www.nuget.org/packages/UnmanagedExports

本包装所有你需要做的是,添加[RGiesecke.DllExport.DllExport]你的方法那样:

C#的.dll项目:

  [RGiesecke.DllExport.DllExport]
公共静态字符串yourFunction(字符串yourParameter)
{
    返回CSHARP字符串;
}
 

Java项目:

 公共接口JNA扩展库{
    JNA INSTANCE =(JNA)Native.loadLibrary(yourCSharpProject.dll,jna.class);
公共字符串yourFunction(字符串yourParameter);
}
 

使用在code:

 的System.out.println(jna.INSTANCE.yourFunction(nothingImportant));
 

中提琴!

前面已经提到过它的工作原理非常简单,但这种方法有一定的局限性:

  • 仅可用于简单数据类型作为参数及放大器;返回值
  • 在没有可用的MethodOverloading。 yourFunction(字符串yourParameter)和yourFunction(字符串yourParameter,字符串yourSecondParameter)不起作用!你有他们不同的名字
  • 使用数组作为参数或返回值。 (JNA提供字符串数组,但我不能够使用它们在C#中)(也许有一个解决方案,但我不能拿出一个为止!)
  • 如果您导出方法,你可以不在内部在C#code调用它(简单的绕过了以下内容:

  [RGiesecke.DllExport.DllExport]
公共静态布尔externalAvailable(字符串yourParameter)
{
    返回yourInternalFunction(yourParameter);
}
 

使用C#它的伟大工程,用VB.NET和F#我没有经验。 希望这有助于!

I am new to accessing DLLs from Java using JNA. I need to access methods from a class within a DLL(written in .net). Form this sample DLL below, I am trying to get AuditID and Server ID. I am ending with the following error while I am running my code. Any guidance really appreciated.

/// Error ///

 Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function  'GetEnrollcontext': The specified procedure could not be found.

//DLL File Code//

SampleDLL.ProfileEnroll enrollcontext = new SampleDLL.ProfileEnroll();
enrollcontext.Url =" url";
enrollcontext.AuditIdType = SampleDLL.ProfileId;
enrollcontext.AuditId = "22222222 "; 
enrollcontext.ServerId = "server1";

/// Java Code ///

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import dllExtract.DLLExtractTest.SampleDLL.Enrollcontext;


public class SampleDLLExtract {

    public interface SampleDLL extends Library {
        SampleDLL INSTANCE = (SampleDLL) Native.loadLibrary("SampleDLL",
            SampleDLL.class);

        public static class Enrollcontext extends Structure { 

            public String auditId;
            public String serverId;
        }
            void GetEnrollcontext(Enrollcontext ec);                     // void ();
    }
    public static void main(String[] args) {
        SampleDLL sdll = SampleDLL.INSTANCE;
        SampleDLL.Enrollcontext enrollContext = new SampleDLL.Enrollcontext();
        sdll.GetEnrollcontext(enrollContext);

        System.out.println(sdll.toString(sdll.GetEnrollcontext(enrollContext))); 
    }
}

解决方案

in fact there is a solution for you to use C#, VB.NET or F# code via JNA in Java (and nothing else)! and it is also very easy to use: https://www.nuget.org/packages/UnmanagedExports

with this package all you need to do is, add [RGiesecke.DllExport.DllExport] to your methods like that:

C# .dll Project:

[RGiesecke.DllExport.DllExport]
public static String yourFunction(String yourParameter)
{
    return "CSharp String";
}

Java Project:

public interface jna extends Library {
    jna INSTANCE = (jna) Native.loadLibrary("yourCSharpProject.dll", jna.class);
public String yourFunction(String yourParameter);
}

use it in the code:

System.out.println(jna.INSTANCE.yourFunction("nothingImportant"));

Viola!

As already mentioned it works very easy, but this solution has some limitations:

  • only available for simple datatypes as parameter & return values
  • no MethodOverloading available. yourFunction(String yourParameter) and yourFunction(String yourParameter, String yourSecondParameter) does not work! you have to name them differently
  • Use arrays as parameter or return values. (JNA offers StringArray, but I am not able to use them in C#) (maybe there is a solution, but I couldn't come up with one so far!)
  • if you export a method you can't call it internally in your C# code (simple to bypass that by the following:

.

[RGiesecke.DllExport.DllExport]
public static Boolean externalAvailable(String yourParameter)
{
    return yourInternalFunction(yourParameter);
}

With C# it works great, with VB.NET and F# I have no experience. hope this helps!

这篇关于从Java中使用JNA调用DLL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆