前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2018-11-29 java和dll交互

2018-11-29 java和dll交互

作者头像
oracle3
发布2022-05-13 08:33:24
2820
发布2022-05-13 08:33:24
举报
文章被收录于专栏:oracle3技术大杂烩

参考文章《JNA:JAVA调用DLL 超详细代码实战》和《JNA Examples》实现了java和c实现的dll相互调用,细节如下:

1、dll生成

我们继续使用《Golang与DLL交互》一样的c代码

使用vs2013生成dll库,添加代码如下:

// testdll.cpp : 定义 DLL 应用程序的导出函数。

//

#include "stdafx.h"

#include <stdio.h>

#ifndef TM_ROBOT_API

#define TM_ROBOT_API extern "C" __declspec(dllexport)

#else

#define TM_ROBOT_API extern "C" __declspec(dllimport)

#endif

TM_ROBOT_API void fun1(int* pVal) {

代码语言:txt
复制
char buff[128];
代码语言:txt
复制
sprintf\_s(buff, "fun1, val: %d -> 999\n", \*pVal);
代码语言:txt
复制
OutputDebugStringA(buff);
代码语言:txt
复制
\*pVal = 999;

}

struct MyStruct

{

代码语言:txt
复制
int nVal1;
代码语言:txt
复制
float nVal2;

};

typedef int(*CB_MY)(int nVal, int fVal);

TM_ROBOT_API void fun2(MyStruct* pVal) {

代码语言:txt
复制
char buff[128];
代码语言:txt
复制
sprintf\_s(buff, "fun2, val: 1->%d, 2->%.4f -> 1,2\n", pVal->nVal1, pVal->nVal2);
代码语言:txt
复制
OutputDebugStringA(buff);
代码语言:txt
复制
pVal->nVal1 = 1;
代码语言:txt
复制
pVal->nVal2 = 2.2;

}

TM_ROBOT_API void fun3(CB_MY pFun) {

代码语言:txt
复制
char buff[128];
代码语言:txt
复制
sprintf\_s(buff, "fun3, val: %08X -> call it 10s\n", pFun);
代码语言:txt
复制
OutputDebugStringA(buff);
代码语言:txt
复制
for (int i = 80; i<100; i++)
代码语言:txt
复制
{
代码语言:txt
复制
	pFun((int)(i\*3.3), (int)(i\*1.1));
代码语言:txt
复制
	Sleep(10);
代码语言:txt
复制
}

}

特别注意的是系统64为要生成64位的dll

2、java代码--jna接口,HelloInterface.java

package com.test.hellojna;

import java.util.Arrays;

import java.util.List;

import com.sun.jna.Callback;

import com.sun.jna.Library;

import com.sun.jna.Structure;

import com.sun.jna.ptr.IntByReference;

public interface HelloInterface extends Library {

代码语言:txt
复制
public void fun1(IntByReference  pVal);
代码语言:txt
复制
public void fun2(MyStruct.ByReference pVal);
代码语言:txt
复制
public void fun3(CB\_MY pFun);
代码语言:txt
复制
// define an interface that wraps the callback code
代码语言:txt
复制
public interface CB\_MY extends Callback {
代码语言:txt
复制
	int invoke(int nVal,int fVal);
代码语言:txt
复制
}
代码语言:txt
复制
public static class MyStruct extends Structure {
代码语言:txt
复制
	public static class ByReference extends MyStruct implements Structure.ByReference {
代码语言:txt
复制
	}
代码语言:txt
复制
	public int nVal1;
代码语言:txt
复制
	public float nVal2;
代码语言:txt
复制
	@Override
代码语言:txt
复制
	protected List<String> getFieldOrder() {
代码语言:txt
复制
		return Arrays.asList(new String[] { "nVal1", "nVal2" });
代码语言:txt
复制
	}
代码语言:txt
复制
}

}

这里注意的是指针的地方都是对应相应的Reference类

结构体的特殊定义和回调函数的特殊定义

3、java代码-dll接口实例,HelloBase.java

package com.test.hellojna;

import com.sun.jna.Native;

public class HelloBase {

代码语言:txt
复制
public static HelloInterface instance = null;
代码语言:txt
复制
public static HelloInterface getInstance() {
代码语言:txt
复制
	if (instance != null)
代码语言:txt
复制
		return instance;
代码语言:txt
复制
	try {
代码语言:txt
复制
		instance = (HelloInterface)Native.loadLibrary("testdll", HelloInterface.class);
代码语言:txt
复制
	} catch (Exception e) {
代码语言:txt
复制
		e.printStackTrace();
代码语言:txt
复制
	}
代码语言:txt
复制
	return instance;
代码语言:txt
复制
}

}

4、java代码--测试代码,App.java

package com.test.hellojna;

import com.sun.jna.ptr.IntByReference;

import com.test.hellojna.HelloInterface.CB_MY;

/**

* Hello world!

*

*/

public class App

{

    public static void main( String[] args )

    {

    HelloInterface myinterface = HelloBase.getInstance();

    int aa = 10;

    final IntByReference aa_valRef = new IntByReference(aa);

    myinterface.fun1(aa_valRef);

    System.out.println("########" + aa_valRef.getValue());

    final HelloInterface.MyStruct.ByReference arg1 = new HelloInterface.MyStruct.ByReference();

代码语言:txt
复制
    arg1.nVal1 = 11;
代码语言:txt
复制
    arg1.nVal2 = 22.22f;
代码语言:txt
复制
    myinterface.fun2(arg1);

    System.out.println("************" + "nVal1=" + arg1.nVal1 + ",nVal2=" + arg1.nVal2);

    myinterface.fun3(new CB_MY() {

    public int invoke(int nVal,int fVal) {

        System.out.println("cb_my:" + nVal+ " " + fVal);

        return 0;

    }

    }) ;

    System.out.println("============");

    }

}

这里要注意的是Reference相关的都需要new

具体工程代码放在csdn:

c代码https://download.csdn.net/download/oracle2488/10815527

java代码https://download.csdn.net/download/oracle2488/10815819

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、dll生成
  • 3、java代码-dll接口实例,HelloBase.java
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档