java调用cdll(JAVA调用接口)

本篇文章给大家谈谈java调用cdll,以及JAVA调用接口对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、java 调用C写的DLL2、java调用C#封装的DLL文件3、java 如何调用dll?4、java用jna调用C语言dll接口中的回调函数怎么写

java 调用C写的DLL

 一、 生成C的头文件

1. 编辑Main.java

public class Main

{

public native static int getStrNum(byte str[], int strLen);

}

2. 生成头文件

按win + r打开“运行”窗口,输入“cmd”,打开DOS控制台窗口。进入上面Main.java所在的目录中,输入:

javac Main.java

javah Main

两条命令完成后会生成Main.h文件

二、 生成DLL

1. 新建空工程

在VS中新建工程:Win32 Console Application,取名“MakeDLL”,选择空工程。新建后修改工程属性:

(1) General中,将“Configuration Type”改为“Dynamic Library (.dll)”;

(2) C/C++的General中,将“Additional Include Directories”添加两项:

“C:Program FilesJavajdk1.5.0_06include”

“C:Program FilesJavajdk1.5.0_06includewin32”

根据你安装的JAVA路径而设置,这是因为在C/C++编译过程中要使用JAVA的jni.h等文件

2. 将上面生成的Main.h添加入工程

3. 新建一个新的文件main.cpp,代码如下:

#include ’Main.h’

#include ’string.h’

JNIEXPORT jint JNICALL Java_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)

{

jbyte *buffer = (*env).GetByteArrayElements(str, 0);

buffer[strLen] = ’’; // 由于JAVA自动分配空间,需要传进来字符串长度参数

jint len = strlen((char*)buffer);

return len;

}

4. 按F7编译链接,生成MakeDLL.dll文件

三、 JAVA调用DLL

在JAVA中使用上面生成的DLL文件:

1. 将MakeDLL.dll复制到与使用DLL的JAVA文件相同的目录下。

2. JAVA文件的源代码:

public class Main

{

static

{

System.loadLibrary(’MakeDLL’);//加载资源文件MakeDLL.dll

}

public native static int getStrNum(byte str[], int strLen);

public static void main(String[] args)

{

Main instance = new Main();

String str = new String(’haha’);

int num = instance.getStrNum(str.getBytes(), str.length());

System.out.println(num);

}

}

java调用C#封装的DLL文件

望穿秋水待伊人

非也!

1. 如果你愿意采用COM组件的方式,可以一试!JAVA有COM4Java的组件(我没记错的话)。

先将C#的dll用COM Callerable Wrapper(CCW)封装一下,在C++中编写COM dll调用C#的托管dll,之后在Java中使用COM4J组件访问这个C++编写的COM dll组件!

如果不明白,使用Google或者Bing搜索下CCW和RCW。

2. webservice

估计你不会这样做的,也没必要

3. 重写下吧,用C++

java调用cdll(JAVA调用接口)

java 如何调用dll?

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

简单介绍及应用如下:

一、JAVA中所需要做的工作

在JAVA程序中,首先需要在类中声明所调用的库名称,如下:

static {

System.loadLibrary(“goodluck”);

}

在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。

还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:

public native static void set(int i);

public native static int get();

然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。

例如程序testdll.java,内容为:

public class testdll

{

static

{

System.loadLibrary(“goodluck”);

}

public native static int get();

public native static void set(int i);

public static void main(String[] args)

{

testdll test = new testdll();

test.set(10);

System.out.println(test.get());

}

}

用javac testdll.java编译它,会生成testdll.class。

再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

二、C/C++中所需要做的工作

对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

接上例子。我们先看一下testdll.h文件的内容:

#i nclude jni.h

#ifndef _Included_testdll

#define _Included_testdll

#ifdef __cplusplus

extern “C” {

#endif

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

#ifdef __cplusplus

}

#endif

#endif

在具体实现的时候,我们只关心两个函数原型

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

好,下面我们用testdll.cpp文件具体实现这两个函数:

#i nclude “testdll.h”

int i = 0;

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)

{

return i;

}

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)

{

i = j;

}

编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。

java用jna调用C语言dll接口中的回调函数怎么写

简单的你会写,那就好办,直接上代码

public interface TestAPI extends StdCallLibrary {

    interface LoginReply extends StdCallCallback {

        /**

         * 登录回调

         */

        void invoke(String userId, long retCode, String retMsg);

    }

    /**

     * 注册一个登录回调方法.此方法是dll提供的

     */

    void RegisterLoginReply(LoginReply loginReply);

}

/**

 * 实现登录回调方法

 */

private class LoginReplyCallBack implements TestAPI.LoginReply {

    @Override

    public void invoke(String userId, long retCode, String retMsg) {

        log.info(“登录回调方法:{},{},{}”, userId, retCode, retMsg);

    }

}

// 设置登录回调

api.RegisterLoginReply(loginReplyCallBack);

java调用cdll的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于JAVA调用接口、java调用cdll的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 04:02:39
下一篇 2024年4月1日 04:10:51

相关推荐

  • java写properties,java写properties文件

    property在Java中的用法 . getProperty ( String key) , 用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。2. load ( InputStream inStream) ,从输入流中读取属性列表(键和元素对)。 是的, PropertyResourceBundle 不使用 …

    2024年5月20日
    3700
  • java反向输出列表,java反向输出数组

    java中,从键盘中输入5个字符串存入数组中..然后反向输出这5个字符串… 其实不需要用for循环,StringBuffer中已经提供了倒置的方法,貌似方法名也是叫reverse。 System.out.println(请输入一个字符串:);string s = br.readLine();//readLine()读入程序中的是一个字符串。//j…

    2024年5月20日
    3400
  • c语言中什么是接口函数,c语言函数设计

    从接口形式上分类,c语言中的函数可分为? 从接口形式上分类,函数分为无参函数和有参函数。 C语言中的函数可以分为以下几类:内置函数:这些是由C语言标准库提供的函数,例如数学函数、字符串函数等。自定义函数:这些是由程序员自己定义的函数,可以用来实现特定的功能。 从接口形式上分类,c语言中的函数可分为?C语言中的函数可以分为以下几类:内置函数:这些是由C语言标准…

    2024年5月20日
    4200
  • 用java编写rpg游戏,用java编写游戏需要什么软件

    怎么用java做游戏? 1、设计游戏,首先就要设计界面。首先看一下我设计的一个界面。界面分为左边的游戏区与右边的控制区。游戏区包含“得分信息”和贪吃蛇的游戏区,右边控制区有“开始”“暂停”“停止”按钮,等级选择单选框以及游戏排行榜。 2、手机游戏开发手机游戏开发其实是j2me,是java语言的一个发展方向,用j2me就可以制作手机游戏以及软件。 3、首先,我…

    2024年5月20日
    3600
  • 定义接口java文件中可以定义类吗,java中定义接口的方式

    java中,定义了一个接口,接着创建一个类去实现接口。 首先,接口中定义的方法都需要实现它的实体类来实现。 接口是用来做规范,标准的,如果实现这个接口的实体类用不到某些在接口中定义的方法那么就说明你的接口设计有问题,应该是将公用的,规定性的方法定义出来就好,不要太具体。 接下来,需要定义一个类来实现接口,因为不知道JAVA的内置矩形类是什么名,所以为了安全,…

    2024年5月20日
    3800
  • java重写排序方法,java 重写sort排序

    用java重写Comparator实现自定义排序 1、返回值是int -1,0或1。1表示第一个数比第二个数大,0表示相等,-1表示第一个数比第二个数小。这个int跟你要比较的数值类型没关系。 2、你这个参数实际却没有作用,你为什么不传入 1/2/ 3 分别表示按哪种方式排序。 3、比如:你想对整数采用绝对大小来排序,Integer是不符合要求的,你不需要去…

    2024年5月20日
    2500
  • 关于java中如何查看类路径的信息

    如何为Java程序动态的指定类搜索路径? 你好,提问者:指定资源路径的方法有两种:一种是绝对路径,一种是相对路径。 要解决问题之前,我们需要下载java这个软件,在浏览器上搜索,记住下载的具体位置,方便下一步的操作。 File类有两个常用方法可以得到文件路径一个是:getCanonicalPath(),另一个是:getAbsolutePath(),可以通过F…

    2024年5月20日
    3700
  • java输出空心菱形,java输出实心菱形

    用Java语言输出空心菱形 1、整体实现思路:菱形9行9列可以将菱形分成上下两个三角形,分析每行空格数和星号个数的关系。 2、//只用一个for循环等于用一维的思维处理二维的问题,这就必须找到两者之间的关系。//经过观察,发现*出现的位置与所处行数确有一定关系。 3、if(c==1||C==2*a-1)这里a是行号,前面已经把第一个*之前的空格都打完了 后面…

    2024年5月20日
    3500
  • java文件对象的保存,java 保存对象

    java如何保存文件 1、在 Java 中使用表格输入数据并保存为文件,可以使用 Swing 包中的 JTable 组件和 I/O 类库中的文件操作方法。首先,你需要创建一个 JTable 对象,并在表格中输入数据。 2、一般都是这样的,就是在你服务器有一个专门放置图片的文件夹,然后数据库保存的是你服务器图片的路径。需要用的时候就去数据库里面取路径。得到路径…

    2024年5月20日
    3200
  • java和c语言互通吗,java和c语言的相同和不同

    JAVA与C语言的联系 1、Java语言与C/C++语言有着紧密的联系,Java中的许多术语来自于C++,起语法也来自于C++。因此Java的语法和c++的语法计划一模一样。下面简单介绍一下Java的具体语法。 2、\x0d\x0a\x0d\x0aC++是在C语言的基础上加入了面向对象的概念,成为混合型面向对象语言,功能强大,但难度也大。 3、JAVA是基于…

    2024年5月20日
    4100

发表回复

登录后才能评论



关注微信