java使用JNA调用dll踩的坑

原文:https://www.cnblogs.com/wyongbo/p/jnaTest.html
因原文,有些点讲的不是非常的清楚,本人C#以及C#开发工具VS也不是非常的熟悉。因此坑了一下午,下面记录一下遇到的一些坑。
一、环境
开发工具:Visual Studio2019、Eclipse
SDK:jdk8-x64

二、准备工作
JNA下载 提取码: wd6v

三、入坑

  1. 生成C#DLL
    1.1启动VS创建C#项目(这里注意是创建.NET Framework类库)在这里插入图片描述
    1.2设置c#项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里记得保存,C#比较坑关闭时不提示你保存。

    1.3来编写我们需要调用的类
    在这里插入图片描述

    然后在项目上点击右键,点击生成就会看见下面的结果。
    在这里插入图片描述
    第一步已经顺利完成了,接下来我们开始第二步

  2. 生成c++DLL

    好家伙这里坑了我一下午,下面来记录一下。
    这里已经安装了VS,但是再次打开VS安装包会看见下面的图片效果
    在这里插入图片描述
    点击修改
    在这里插入图片描述
    下面划重点,这里一定要勾选(默认是不勾选的)。不勾选的话下面的步骤就不用看了(此处坑了一下午)。
    在这里插入图片描述
    接下来我们创建C++项目
    右键“解决方案”,新建项目
    在这里插入图片描述
    此处上面如果不勾选的话是建不了CLR项目的
    在这里插入图片描述
    接下来设置属性
    在这里插入图片描述
    接下来引用我们上面写的项目(右键引用)
    在这里插入图片描述
    在这里插入图片描述
    添加cpp文件(右键源文件)
    在这里插入图片描述
    在这里插入图片描述
    编写新建的cpp文件

#ifdef MYLIBAPI 
#else 
#define  MYLIBAPI  extern "C" __declspec(dllimport)     
#endif 


MYLIBAPI char* getName(char* name);//添加函数声明
MYLIBAPI int getAge(int age);

using namespace System; // 如果不建CLR项目此处引用会报错
using namespace JNATest;

char* getName(char* name)
{
	String^ paraStr = gcnew String(name);
	JNA^ jna = gcnew JNA(); // 注意此处是你写的C#类名
	String^ resultString = jna -> getName(paraStr); // 此处是类里的方法名
	char* result = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToCoTaskMemAnsi(resultString);
	return result;
}

int getAge(int age)
{
	JNA^ jna = gcnew JNA();
	int result = jna -> getAge(age);
	return result;
}

好了C#与C++项目都写完了,接下来右键生成
在这里插入图片描述

  1. 开始写Java代码(这里首先需要将上图倒数第三行路径下的DLL文件放入jdk的bin文件夹中)
package com.bjx.tex.equations;

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

/**
 * 
 * @author Christmas_G
 * @date 2019-06-28 10:34:05
 *
 */
public class Test {

	interface JNALibrary extends Library {

		JNALibrary INSTANCE = (JNALibrary) Native.loadLibrary("JNADll", JNALibrary.class);

		/* 需要调用的方法,方法名与c++方法名相同 */
		String getName(String value);

		int getAge(int age);
	}

	public static void main(String[] args) throws Exception {
		System.out.println(System.getProperty("java.version"));// 输出当前jdk版本号
		System.out.println(System.getProperty("sun.arch.data.model"));// 输出当前jdk所用平台

		String name = JNALibrary.INSTANCE.getName("小红");
		int age = JNALibrary.INSTANCE.getAge(3);
		System.out.println(name + "今年" + age + "岁");

	}
}

运行结果
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值