eclipse如何开发并调用dll文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eclipse如何开发并调用dll文件相关的知识,希望对你有一定的参考价值。

eclipse工具,windows操作系统 ,怎么开发??目前进度:能够生成一般的dll文件,知道要使用jni,希望能得到详细步骤。

  1、创建java项目

  在Eclipse中创建java工程jnidemo,如图1所示:

  当保存TestNative.java文件时,Eclipse会自动在jnidemo项目的bin目录下编译生成TestNative.class文件,如图2所示:

  2、生成.h文件

  使用命令行方式,进入Eclipse下工程目录的bin目录,然后执行javah  com.hik.wyx.TestNative,编译出头文件,如图3所示:

  此时会在bin目录下生成com_hik_wyx_TestNative.h文件,如图4所示:

  3、新建VC工程

  在vc6.0环境中创建一个native的DLL工程,如图5、6所示:

  点击“完成”按钮,之后新建一个TestNative.cpp文件,如图7所示:

  TestNative.cpp文件内容:

  #include"com_hik_wyx_TestNative.h"

  JNIEXPORTvoid JNICALL Java_com_hik_wyx_TestNative_sayHello(JNIEnv *env,jobject obj)

  printf("Hello World !\\n");

  return;

  

  4、添加JNI文件路径

  在工具—选项中,设置平台及目录,在目录中添加JDK的include与win32文件夹,方便以后的JNI使用(这里的jni.h文件位于Java安装目录下的JDK1.6.023\\include,jni_md.h文件位于JDK1.6.0 23\\include\\win32下,因为jni.h文件引用了jni_md.h文件,所以必须将这两个文件置于你的VC工程下;或者直接放到VC安装目录的include目录下,方便以后使用)。如图8所示:

  5、生成DLL

  编译TestNative.cpp在VC项目工程下的Debug目录下生成native.dll文件,如图9所示:

  6、Java工程设置DLL路径

  将native.dll文件拷贝到Java工程bin目录下,如图10所示:

  7、在eclipse环境变量中增加nativelibrary location支持

  点击Java项目右键—Build Path—ConfigureBuild Path,如图11所示:

  如图12所示,增加native library location支持,也就是将具体的DLL文件加入到Java项目中。

  注:步骤7的另外一种方式,就是在步骤6中将native.dll文件拷贝到JDK安装路径的bin目录下。(考虑Java项目的迁移,建议使用将DLL拷贝到Java项目工程路径下的方式)

  8、测试DLL调用

  在TestNative.java文件中加入测试语句,进行DLL调用。

  publicstaticvoid main(String[] args)

  System.loadLibrary("native");

  new TestNative().sayHello();

  

  测试结果:

参考技术A 把dll所在文件夹加入PATH环境变量中,就可以了。
如果是java代码的话,在代码里用System.loadLibrary 调用
参考技术B 第一步:打开我的电脑。
第二步:选择高级设置。
第三步:选择更改环境变量
第四步:选择把dll所在文件夹加入PATH环境变量中。

从 C# 方法,如何调用和运行 DLL,其中 DLL 名称来自 String 变量?

【中文标题】从 C# 方法,如何调用和运行 DLL,其中 DLL 名称来自 String 变量?【英文标题】:from a C# method, how to call and run a DLL, where the DLL name comes from a String variable? 【发布时间】:2012-10-10 15:16:10 【问题描述】:

我是 C#.NET 的新手。我正在编写一个需要调用和运行 DLL 文件的方法,其中 DLL 文件名来自 String 变量-

String[] spl;

String DLLfile = spl[0];

如何导入此 DLL 并从 DLL 中调用函数以获取返回值?我尝试了以下方式..

String DLLfile = "MyDLL.dll";

[DllImport(DLLfile, CallingConvention = CallingConvention.StdCall)]

但它不起作用,因为字符串应该是 'const string' 类型,而 'const string' 不支持变量。请帮我详细的程序。谢谢。

【问题讨论】:

DLL 的名称是否必须包含在字符串中?这似乎很危险,这样做的正当理由很少。 这个 dll 是另一个 .NET 程序集吗?或者可能是一个 c++ dll?甚至是 COM dll?。 @Ramhound 这样做的原因是您可以指定 DLL 的完整路径。否则,您将依赖于库搜索顺序。这是危险的。指定完整路径是避免危险的方法! 首先,请编辑您的问题,而不是在 cmets 中发布代码。 然后启动 Visual Studio 命令提示符并使用 DUMPBIN 获取 DLL 导出的函数列表。例如。 DUMPBIN /exports ABC.dll。您也可以为此使用Dependency Walker。 【参考方案1】:

对于本机 DLL,您可以创建以下静态类:

internal static class NativeWinAPI

    [DllImport("kernel32.dll")]
    internal static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll")]
    internal static extern bool FreeLibrary(IntPtr hModule);

    [DllImport("kernel32.dll")]
    internal static extern IntPtr GetProcAddress(IntPtr hModule,
        string procedureName);

然后按如下方式使用:

// DLLFileName is, say, "MyLibrary.dll"
IntPtr hLibrary = NativeWinAPI.LoadLibrary(DLLFileName);

if (hLibrary != IntPtr.Zero) // DLL is loaded successfully

    // FunctionName is, say, "MyFunctionName"
    IntPtr pointerToFunction = NativeWinAPI.GetProcAddress(hLibrary, FunctionName);

    if (pointerToFunction != IntPtr.Zero)
    
        MyFunctionDelegate function = (MyFunctionDelegate)Marshal.GetDelegateForFunctionPointer(
            pointerToFunction, typeof(MyFunctionDelegate));
        function(123);
    

    NativeWinAPI.FreeLibrary(hLibrary);

其中MyFunctionDelegatedelegate。例如:

delegate void MyFunctionDelegate(int i);

【讨论】:

【参考方案2】:

您可以使用LoadAssembly 方法和CreateInstance 方法来调用方法

        Assembly a = Assembly.Load("example");
        // Get the type to use.
        Type myType = a.GetType("Example");
        // Get the method to call.
        MethodInfo myMethod = myType.GetMethod("MethodA");
        // Create an instance. 
        object obj = Activator.CreateInstance(myType);
        // Execute the method.
        myMethod.Invoke(obj, null);

【讨论】:

问题清楚地表明上下文是非托管 DLL @DavidHeffernan,我不会说这么清楚。任何地方都没有提到它。 OP 在他的问题中没有说他正在尝试加载托管或非托管程序集。他谈到了一个DLL。我已经在这里看到了不知道如何在另一个托管程序集中引用托管程序集并试图使用 DllImport 属性的人提出的问题。他们可能甚至不知道托管代码和非托管代码之间的区别。 @DarinDimitrov 我用DllImport 来暗示原生DLL。 @DavidHeffernan,是的,我只是说我也犯过一次这个错误 :-) OP 没有参与这个讨论太糟糕了,好像他不太关心他的问题。 嗨,我尝试了你指定的所有方式......但无法加载程序集......是的,我对托管和非托管程序集不太了解。我正在动态获取 DLL 文件名、命名空间名称、类名和方法名,并且返回类型始终是 Double in Type。如果能详细说明如何动态运行DLL,对我有很大的帮助。

以上是关于eclipse如何开发并调用dll文件的主要内容,如果未能解决你的问题,请参考以下文章

delphi 如何把其他exe文件加入dll中,并调用

Qt Creator开发Android程序 如何调用C语言的dll

如何破解DLL文件?

C# 中如何调用DLL文件?

LabVIEW如何方便地调用DLL文件

C#调用了一个DLL文件,如何查看DLL的使用方法?小白求问