`
longgangbai
  • 浏览: 7325487 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JNA编程之直接函数映射

阅读更多

        在JNA官网上还介绍了另外一种调用C/C++动态库的方式:直接函数(方法)映射。其编程方法非常简单,连接口定义都免了,只需在类声明中使用关键字native声明动态库的函数,然后在调用动态库的函数之前先调用Native.register方法注册(加载)动态库即可。

 *   在JNA官网上还介绍了另外一种调用C/C++动态库的方式:直接函数(方法)映射。
 * 其编程方法非常简单,连接口定义都免了,只需在类声明中使用关键字native声明动态
 * 库的函数,然后在调用动态库的函数之前先调用Native.register方法注册(加载)动态库即可。
 * 说明:该程序既可以在Windows环境下运行也可以在Linux环境下运行。如果是在Windows下,将加载msvcrt.dll动态库;如果是在Linux下,将加载libm.so动态库。

 linux和unix的libm.so在/lib/libm.so
  
  
  在Platform中的代码如下常量:
 
   C_LIBRARY_NAME = osType == WINDOWS ? "msvcrt" : osType == WINDOWSCE ? "coredll" : "c";
    MATH_LIBRARY_NAME = osType == WINDOWS ? "msvcrt" : osType == WINDOWSCE ? "coredll" : "m";



 

 

package com.etrip.jna.win;

import com.sun.jna.IntegerType;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
/**
 * 
 * @Title: TODO
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:
 * @Date:2012-12-22
 * @author  longgangbai
 * @version 1.0
 */
public class CDirectJNA {
	static class CLibrary {
        public static class size_t extends IntegerType {
            public size_t() {
                super(Native.POINTER_SIZE);
            }
            public size_t(long value) {
                super(Native.POINTER_SIZE, value);
            }
        }
        public static native Pointer memset(Pointer p, int v, size_t len);
        public static native Pointer memset(Pointer p, int v, int len);
        public static native Pointer memset(Pointer p, int v, long len);
        public static native long memset(long p, int v, long len);
        public static native int memset(int p, int v, int len);
        public static native int strlen(String s1);
        public static native int strlen(Pointer p);
        public static native int strlen(byte[] b);
        
        static {
            Native.register(Platform.C_LIBRARY_NAME);
        }
    }

    static interface CInterface extends Library {
    	CInterface instance = (CInterface) Native.loadLibrary(
    			Platform.C_LIBRARY_NAME, CInterface.class);
        Pointer memset(Pointer p, int v, int len);
        int strlen(String s);
    }
   public static void main(String[] args) {
	   String str="longgangbai";
	   System.out.println(CLibrary.strlen(str) +" "+CInterface.instance.strlen(str));
   }
}

 

 

package com.etrip.jna.win;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/**
 * @Title: TODO
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Date:2012-12-22
 * @author 
 * @version 1.0
 */
public class MathDirectJNA {
	/**
	 *通过注册的方式操作cos 
	 */
    static class MathLibrary {
        public static native double cos(double x);
        static {
            Native.register(Platform.MATH_LIBRARY_NAME);
        }
    }
    /**
     * 通过jni方式访问操作cos
     */
    private static class JNI {
        static {
            System.load(Platform.MATH_LIBRARY_NAME);
        }
        
        private static native double cos(double x);
    }
    /**
     *通过加载的方式操作cos 
     */
    interface MathInterfaceLibrary extends Library {
    	MathInterfaceLibrary instance = (MathInterfaceLibrary) Native.loadLibrary(
    			Platform.MATH_LIBRARY_NAME, MathInterfaceLibrary.class);
        double cos(double x);
    }
    
    public static void main(String[] args) {
    	System.out.println(MathLibrary.cos(0.6)+"   "+MathInterfaceLibrary.instance.cos(0.6));
    }
}

 


 【参考链接】:
 https://github.com/twall/jna/blob/master/www/DirectMapping.md 

        下面给出一个调用本地数学函数库的示例,该示例中分别调用了动态库中的cos、sin和pow进行数学计算。
分享到:
评论

相关推荐

    JNA调用DLL函数.rar

    在Java编程环境中,JNA提供了一种无需编写JNI(Java Native Interface)代码就能直接调用本地操作系统API和其他C库函数的方式。 首先,让我们深入了解JNA。JNA是一种开源库,允许Java程序与本地平台API进行交互。它...

    jna.rar_jna_jna.jar_jna文件

    例如,如果你需要调用Windows API中的某个函数,你可以创建一个接口,然后通过JNA的Platform类加载相应的库,并实例化该接口,就可以直接调用本地函数了。 使用JNA,你可以执行以下操作: 1. 调用操作系统API:比如...

    深入浅出JNA—快速调用原生函数

    JNA(Java Native Access)是一个开源的Java框架,它构建在经典的JNI之上,旨在简化Java调用原生函数的过程。JNA通过动态创建一个C语言编写的转发器,自动实现Java和C的数据类型映射,从而免去了编写和维护动态链接...

    JNA 4.1.0 官方版

    JNA平台库提供了大量的结构体、枚举类型和函数接口,使得开发者能够方便地访问操作系统底层的服务,例如文件系统操作、进程管理、网络编程、图形界面交互等。通过这个库,开发者可以避免繁琐的JNI编码工作,直接在...

    jna-4.4.0.jar

    在Java编程中,直接调用操作系统底层的动态链接库(DLL)是相对复杂的一件事情,因为Java是一种跨平台的语言,而DLL通常与特定的操作系统紧密关联。为了在Java中实现这一功能,Java Native Access(JNA)应运而生。...

    jna-3.3.0 & jna-3.3.0-platform

    综上所述,`jna-3.3.0.jar`和`jna-3.3.0-platform.jar`是Java开发中调用本地资源的重要工具,它们提供了一种简便的方式让Java程序能够直接利用操作系统的能力,而无需深入学习C/C++编程。通过理解JNA的工作原理和...

    jna-example.jar包

    JNA的核心在于其映射机制,它通过定义一个Java接口,该接口中的方法对应于C函数,然后通过JNA的库映射加载这个接口,使得Java可以直接调用本机库的函数。JNA的这种设计大大简化了Java与本机库交互的过程,降低了开发...

    jna资料3.0api

    JNA允许你直接以相同的数据类型定义函数,如`int function1(int a, float b, long c)`。这样,Java中的参数将直接映射到C函数的相应参数。 2. **模拟C语言数组**: C语言中,函数可能接受字符数组,如`char *data`...

    jna&jna-platform4.0版和5.6版本.zip

    JNA库本身包含了基本的映射功能,而`jna-platform`是JNA的一个扩展库,包含了大量常见操作系统的结构体、类型和函数映射,如Windows API、Unix/Linux系统调用等。这两个库结合使用,可以让Java开发者更方便地跨平台...

    JNA需要的jar_附赠其它两个版本.zip

    1. **JNA映射机制**:JNA的核心是通过定义Java接口来映射本地函数。这个接口使用特殊的注解,比如`@StandardFunction`或`@Native`,来指示JNA如何调用对应的本地函数。 2. **类型映射**:JNA自动处理Java类型到本地...

    jna4.5jar包

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java接口到本地函数来实现这一点,使得Java开发者可以方便地与本地...

    jna3.2.1.rar

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的中间层,极大地简化了Java与本地操作系统接口的交互。JNA 3.2.1是该库的一个版本,提供了对...

    JNA的jar包

    JNA通过一种映射机制,将Java方法与C函数对应起来,这样在Java代码中调用Java方法时,实际上会触发对底层C函数的调用。这一特性极大地简化了跨平台的本地系统调用,减少了对JNI的依赖。 JNA的工作原理是基于一个...

    JNA相关包 jna.jar

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的中间层,如JNI(Java Native Interface)。JNA通过提供一种抽象的方式来映射Java方法到本地...

    jna4.4.0+jna-platform4.4.0+JNative.zip

    JNA通过提供一种高级映射,使得Java程序员能够轻松地访问本机函数,大大简化了跨平台的系统级编程。在“jna4.4.0+jna-platform4.4.0+JNative.zip”这个压缩包中,包含了JNA库的两个主要组件以及一个名为JNative的...

    JNA所需要的jar包

    而`jna-platform.jar`则包含了许多常见的操作系统平台API的预定义映射,如Windows API、Unix系统调用等,使得开发者可以直接使用这些API,而无需手动配置。 描述中提到的"JNA jar包 jna.jar platform.jar",这里的`...

    jna和examples的jar包

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统 API 直接交互,而无需编写任何本地代码(如C/C++)。JNA 提供了一种方便、高效的桥接机制,使得 Java 开发者能够轻松访问系统...

    JNA实例 JNA实例 JNA实例

    通过这个JNA实例,我们可以看到Java程序是如何利用JNA库来调用C语言编写的函数和处理结构体数据的。这种技术不仅简化了跨语言编程的过程,还提高了代码的可维护性和扩展性。对于需要与现有C/C++代码集成的项目来说,...

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

    JNA通过映射本地函数到Java方法来实现调用。它有一个内存管理机制,可以自动转换Java数据类型到本地平台的数据类型,并处理回调函数。JNA的核心概念包括接口映射、类型映射和指针管理。 2. **使用JNA的步骤**: -...

    JNA调用DLL完整实例demo

    JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数和返回值的转换。JNA库包含了一个库映射机制,能够识别并加载指定的DLL。 在“JNA调用DLL完整实例demo”...

Global site tag (gtag.js) - Google Analytics