`
longgangbai
  • 浏览: 7245860 次
  • 性别: 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 实现回调函数 code.zip

    jna 实现回调函数 code.zip jna 实现回调函数 code.zip jna 实现回调函数 code.zip jna 实现回调函数 code.zip jna 实现回调函数 code.zip jna 实现回调函数 code.zip jna 实现回调函数 code.zip

    JNA 回调函数不稳定现象处理 文件

    JNA 回调函数工作不稳定现象处理 (绝大多数回调不稳定的原因)

    JNA_3.5.1_jar包和JNA—快速调用原生函数文档

    java调用dll所需要的两个jar jna-3.5.1.jar和platform-3.5.1.jar 以及JNA操作文档,函数映射等等

    jna-4.4.0接口映射包

    JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

    jna_test.rar_JNA JAVA C_jna_jna 函数

    JNA方式,JAVA调用C函数,并且C函数可以回调执行JAVA函数

    JNA调用DLL函数.rar

    JNA调用DLL函数.rar 用VC6写了一个加减功能的动态库,供JAVA调用

    jna调用C语言函数库dll、so例子

    jna调用C语言函数库dll、so jni介绍

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包 JNA全称Java Native Access,是一个...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

    JNA-Linux下java程序调用so库接口函数

    在Linux系统下,JAVA程序通过JNA技术实现调用C语言编程输出的so库接口函数,从而实现java程序与c程序之间的交互。

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

    本文原名《使用JNA方便地调用原生函数》发表于2009年3月的“程序员”杂志上。感谢程序员杂志的许可,使这篇文章能够成为免费的电子版,发布于网络上。 程序员杂志发表此文时,略有裁剪,因此本文比程序员上的文章...

    java通过jna返回结构体例子.rar

    java通过jna调用c返回结构体例子,就是解决c语言返回结构体,java用类对象接收,包含jar包,java文件,c文件,操作步骤文档,在linux下完美通过

    JNA调用VC++dll

    JNA调用VC++dll;boolean,String,int,loog,结构体指针,VC++通过回调函数调用java函数

    JNA最新源文件jar包

    开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,大大降低了Java调用本体共享库的开发难度。JNA与.NET平台上的P/Invoke机制一样简单和方便。

    jna包及示例和VS2010入门

    开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。 JNA3.09API参考手册.chm 是我制作的JNA类库3.09版的Java API参考手册。方便查找。 JNA是最新的...

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

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

    深入浅出JNA—快速调用原生函数 和许多解释执行的语言一样,Java提供了调用原生函数的机制,以加强Java平台的能力。Java™ Native Interface (JNI)就是Java调用原生函数的机制。 事实上,很多Java核心代码内部就是...

    JNA 3.3.0 API

    JNA允许使用JAVA方法调用方式来直接调用本地函数.它提供了一个动态的C语言编写的转发器,自动实现JAVA类型和C类型的映射. JNA使用一个小型本地库存根来动态调用本地代码.开发者需要定义一个JAVA接口来描述本地库存的...

    jna-3.5.2jar

    JNA使Java调用原生函数就像.NET上的P/Invoke一样方便、快捷。 JNA的功能和P/Invoke类似,但编写方法与P/Invoke截然不同。JNA没有使用Annotation, 而是通过编写一般的Java代码来实现。 P/Invoke是.NET平台的机制。而...

    jna 调用dll需要用到的jar包

    开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。 优点 JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且...

    JNA 转java接口以及指针结构体解析

    经过几天的奋战,终于让我搞懂了JNA的解析以及指针在结构体中的应用!!!下了很多的资料,里面包含c++的.h头文件,给需要帮助的人看看!! 里面包含代码以及解析过程。

Global site tag (gtag.js) - Google Analytics