`

JNA映射自己编写的DLL

阅读更多

原始发表时间:2009-07-03

 

学习过程 - 思维导图:


    使用VS 2008开发自己的DLL,用于创建桌面快捷方式,而后通过Java调用DLL来实现快捷方式创建的功能。
    JNA版本为 3.1.0 b0
    JDK 1.6.0

    本文旨在说明JNA可以如何实现DLL的调用,暂不给出快捷方式创建的实现,因为这个调用实际上是属于c、win32api、shell编程的范畴。

文章大纲
1.新建项目
2.编写代码
3.编译生成W32DLL.dll
4.JNA映射自己编写的DLL文件(遇到问题及解决方法)
5.小结

1.新建项目
    在VS中【新建项目】,项目类型选择Windows项目,如下图:

    设置项目的程序类型为“DLL”,并且设置为空项目。

2.编写代码
    编写头文件和cpp代码:
----------------  DLLcode.h  ----------------
#ifdef DLLDIR_EX
    #define DLLDIR __declspec(dllexport) // export dll info
#else
    #define DLLDIR __declspec(dllimport) // import dll info
#endif

extern "C"{
    void DLLDIR DLLfun1(char*);
    int DLLDIR DLLfun2(int);
};

extern int DLLDIR DLLArg;

class DLLDIR DLLclass{
public :
    DLLclass();
    ~DLLclass();

    int add(int, int);
    int sub(int, int);
    int Arg;
    static int go(int a){
        return a;
    };
};

----------------  DLLcode.cpp  ----------------
#include "DLLCode.h"
#include <iostream>

using namespace std;
void DLLfun1(char* a){
    cout<<a<<endl;
};
int DLLfun2(int a){return a<<1;};
int DLLArg = 100;
DLLclass::DLLclass(){};
DLLclass::~DLLclass(){};

int DLLclass::add(int a, int b){
    return a + b;
};
int DLLclass::sub(int a, int b){
    return a - b;
};

3.编译生成W32DLL.dll

    编写代码后,在VS主菜单中依次选择“生成”->“生成解决方案”。
    项目目录为 D:\develop\Net_space\W32DLL\,所以来到debug目录(路径为D:\develop\Net_space\W32DLL\Debug\)中找到生成的dll文件W32DLL.dll

4.JNA映射自己编写的DLL文件(遇到问题及解决方法)
Java程序如下:

package demo.win32api;

import java.io.UnsupportedEncodingException;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;

/**
 * Updated at 上午10:49:20, on 2009-7-3<br>
 *
 * @author caesar
 */
public class TestCustomWin32DLL {

    /**
     * Updated at 上午10:49:20, on 2009-7-3<br>
     *
     * @param args
     * @author caesar
     * @throws UnsupportedEncodingException
     */
    public static void main(String[] args) throws UnsupportedEncodingException {
        NativeLibrary.addSearchPath("W32DLL", "D:/develop/Net_space/W32DLL/Debug");
        W32DLL lib = (W32DLL) Native.loadLibrary("W32DLL", W32DLL.class);
        System.out.println(lib);
        try {
            int res = lib.DLLfun2(1);
            System.out.println("DLLfun2: " + res);
            res = lib.add(1, 2);
            System.out.println("add: " + res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

interface W32DLL extends Library {
    int add(int a, int b);
    int DLLfun2(int a);
}

    执行上面的Java程序后,控制台输出如下内容:
Proxy interface to Native Library <D:\develop\Net_space\W32DLL\Debug\W32DLL.dll@54722560>
DLLfun2: 2
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'add': Õ?»µ½?¶¨µ
    at com.sun.jna.Function.<init>(Function.java:129)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:250)
    at com.sun.jna.Library$Handler.invoke(Library.java:191)
    at demo.win32api.$Proxy0.add(Unknown Source)
    at demo.win32api.TestCustomWin32DLL.main(TestCustomWin32DLL.java:33)

    不明白,映射普通的C函数,JNA执行无误,但是在映射c++的方法时会出现无法找到函数的问题。难道JNA只能映射C函数,而不能处理C++的OO特性?google得到文章一篇

原文链接:http://markmail.org/message/oygj6642zfsexcz7

Google网页快照链接:http://203.208.39.132/search?q=cache:vKtda_84QGQJ:markmail.org/message/oygj6642zfsexcz7+jna+c%2B%2B&cd=5&hl=zh-CN&ct=clnk&gl=cn&client=firefox-a&st_usg=ALhdy2_TQaf9DJb4klQOt17Oa0H4T23Twg

注: 请原谅我写了那么冗长的链接,主要是因为原文链接很可能无法访问,所以后来通过Google的网页快照才得以见到原文的副本。


帖子部分内容如下:

JNA doesn't "do" C++ , at least not automatically. While C++ methods may be exported from a shared library, several layers of translation are needed before you can access C++ objects and methods transparently. You need to interpret and generate mangled function names before you can create an object, and then parse and dispatch virtual function tables before you can invoke any methods on it. It'd be cool to have some C++ layers on top of JNA , but I currently have no reason to make them, so it's not likely to happen.

There are other offerings that claim to provide good C++ integration (JNIEasy comes to mind, although "easy" might be a bit of a stretch). I can't think of any free projects offhand, but there's a list in the OTHERS file in the JNA root dir.

I don't know how well Swig handles wrapping objects and object methods, or if it just exports a functional interface. If the latter, you could just as well wrap your library in a few key 'extern "C"' functions and use JNA .

……………………


大意是说:JNA无法处理C++,作者的建议是在C程序包装并调用C++,而后JNA来调用这些C函数,从而使用一些需要用到C++特性的功能。

5.小结
    JNA无法处理C++,那么使用C函数调用来封装C++层面的代码,让JNA调用C函数,来使用一些C++层面的特性。
    至此已经做好使用JNA来实现调用shell创建桌面快捷方式的一切前期准备。

分享到:
评论

相关推荐

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    - JNA包含了一组平台库,这些库已经映射了许多本地函数,并提供了一套简化本地访问的通用接口。 #### 在项目中使用JNA的具体步骤 1. **引入JNA依赖**:在项目中添加JNA相关的依赖库。 2. **定义接口**:创建一个...

    JNA调用DLL完整实例demo

    JNA库包含了一个库映射机制,能够识别并加载指定的DLL。 在“JNA调用DLL完整实例demo”中,我们首先需要创建一个Java接口,这个接口将代表DLL中的函数。例如,如果DLL中有一个名为`recvWork`的函数,我们的Java接口...

    Jna调用dll实例

    JNA(Java Native Access)是Java平台上的一个开源库,允许Java代码直接调用本地操作系统API,而无需编写C/C++的桥接代码。这个实例是关于如何使用JNA来调用DLL(动态链接库)的教程,特别强调了在调用过程中可能...

    JNA调用VC++dll

    JNA允许你定义数据类型映射,使得Java的数据可以直接传递给DLL函数,反之亦然。例如,Java的`boolean`通常对应C/C++的`BOOL`或`int`,`String`可以映射为C的`char*`,`int`和`long`则直接对应。 2. **结构体指针**...

    JAVA利用JNA调用DLL

    通过上述方式,你可以使用JNA轻松地在Java中调用C DLL,无论是32位还是64位,无需编写复杂的JNI代码。在实际应用中,确保正确配置项目依赖,如添加JNA库的jar文件,并注意与本地库的兼容性问题。JNA测试项目"JNATest...

    jna jar实现java调用dll

    Java Native Access(JNA)是一种在Java中调用本地库(如DLL文件)的框架,无需编写C语言的桥接代码或使用Java的本机接口(JNI)。它提供了一种简单的方法来映射函数调用,数据类型和结构,使得Java开发者能够方便地...

    jna demo 内附dll方法查看工具

    JNA通过动态加载库(在Windows上是DLL,在Unix和Linux上是.so文件)来实现这一功能,它提供了一种高级的映射机制,使得Java开发者可以方便地与本地库进行交互。 **JNA的工作原理** JNA的核心思想是通过Java对象...

    java用JNA调用dll实例,包含各种参数调用

    Java Native Access(JNA)是Java平台上的一个开源库,它提供了直接调用系统DLL函数的能力,无需编写C代码或者使用JNI(Java Native Interface)。本实例将深入探讨如何使用JNA调用DLL,并涵盖了各种参数类型,包括...

    java使用jna调用c#中dll的方法详解

    Java Native Access (JNA) 是一个Java库,它允许Java程序在运行时动态地访问操作系统本地库(如Windows上的.dll文件)而无需编写JNI(Java Native Interface)代码。JNA通过提供一个Java接口来描述目标本地库的函数...

    基于JNA的java调用DLL动态库实例

    JNA是Java平台上的一个开源库,它允许Java代码直接调用本机库(如DLL或.so文件),而无需编写C语言的中间接口。JNA通过映射Java方法到本机函数,实现了跨语言的通信。 首先,确保已将"NetSdk.dll"文件复制到JDK的...

    jna.jar包资源,dll调用使用

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接与本地操作系统API交互,无需编写C代码或使用JNI(Java Native Interface)。标题提到的"jna.jar包资源,dll调用使用"是指JNA库的一个具体...

    Jna-调用本地dll

    标题“Jna-调用本地dll”意味着我们将探讨如何使用JNA来调用Windows上的DLL函数。DLL文件通常包含由C、C++或其他支持的编程语言编写的函数,这些函数可以被多个程序共享,以提高效率和资源利用率。 描述中提到的...

    JNA调用DLL函数.rar

    总之,"JNA调用DLL函数"这个主题涵盖了Java平台的本地调用能力,以及如何利用这种能力与C语言编写的动态链接库进行通信。这对于开发需要访问操作系统特定功能或者利用已有的C库的Java应用程序来说,是一项重要的技能...

    最简单的JNA调用DLL

    JNA是Java平台上的一个开源库,它允许Java代码与本地平台API进行交互,无需编写C语言的JNI(Java Native Interface)代码。 JNA的工作原理基于映射,它将Java接口映射到本地库的函数,使得Java代码可以直接调用这些...

    jna-call-dll-and-C-call-java.zip_java dll_java dll 回调_jna_jna调用d

    在JNA调用DLL的过程中,需要注意一些问题,例如类型映射、内存管理以及错误处理。类型映射需要确保Java和C的数据类型对应正确,否则可能会导致数据不匹配的问题。内存管理则涉及到如何在Java和C之间传递复杂的数据...

    JNA java调用dll

    接口中的方法名对应DLL中的函数名,返回类型和参数类型则需要映射到JNA的类型。 ```java public interface MyDll extends Library { int someFunction(int param1, String param2); } ``` 3. **加载DLL**:...

    jna调用C++dll

    本示例将探讨如何使用JNA调用C++编写的动态链接库(DLL)以及如何实现从DLL到Java的回调功能。 首先,我们需要理解JNA的工作原理。JNA通过映射Java接口到C函数来实现调用。这些接口定义了C++ DLL中的函数签名,使得...

    JNA调用.dll文件或.so动态链接库的代码demo

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接与本地操作系统API交互,无需编写C/C++的桥接代码。JNA提供了动态加载.dll(Windows)或.so(Linux/Unix)文件的能力,使得Java应用程序能够...

    Java 通过JNA访问其它语言的dll文件

    Java 通过JNA(Java Native Access)访问其他语言编写的DLL(动态链接库)文件是一项常见的跨语言交互技术。在本实例中,我们将探讨如何利用Java调用由Delphi编写的DLL,特别是在处理语言间参数类型转换时需要注意的...

Global site tag (gtag.js) - Google Analytics