JNA 详细完整实例

简介: 啰嗦话不多说,网上很多这方面的教程,但是我也看了好久也能运行一个成功的例子,因为很多地方都忽略了下面来演示个完整的jna例子1.

啰嗦话不多说,网上很多这方面的教程,但是我也看了好久也能运行一个成功的例子,因为很多地方都忽略了


下面来演示个完整的jna例子


1. 随便使用个c或c++开发工具(我用的VC++6.0)

打开软件新建个dll工程,VC里面是win32 dynamic-link library,输入工程名称后点击下一步,然后再选a simple dll project,第一项是空的project,我比较懒就选第二个,有简单的文件存在,然后自己拿来改下,最后确定就能看到工程已经建好了


2. 写C的接口文件,就是以.h结尾的那个文件,选择文件-->新建-->C/C++Header File文件,然后就能看到工程的header文件中有了个新的.h文件(我起的名字是test)

然后打开test.h文件,声明我的接口咯


这里值得注意的地方是必须写(extern "c"的声明,不然到时候使用java的jna是不可能匹配到这个方法的,很明显会抛出异常java.lang.UnsatisfiedLinkError: Error looking up function 'add': ÕҲ»µ½ָ¶¨µ),这个文件相当于我们的java中的interface,你可以这样理解


extern "C" _declspec(dllexport) 

int add(int first, int second);  


3. 写C接口的实现类,如何实现这个add方法


打开source file很明显看到有一个文件是xxx.cpp(xxx是以你的工程名字来定的), 另外一个是stdafx.cpp, 这个不需要管他, 我们就在xxx.cpp中写代码吧


xxx.cpp原本就存在内容,你不喜欢的,可以直接新建一个source file


// sss.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

然后我们在这些内容下添加我们的add方法实现,要include我们刚刚写的test.h文件


// sss.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "test.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

int add(int a, int b){
	return a+b;
}



4. C方面的基本的完成了,最后就是打包成dll,直接按F7,全自动打包,然后找到这个工程的目录下,看到有一个debug的文件夹,里面就有一个dll,等下直接扔到java工程中


5. 打开eclipse新建一个java project, 把刚刚的dll拷贝到工程的目录下点着工程的名字,然后黏贴下去就可以了, 然后随便在网上找个jna.jar文件,build path到这个工程中


然后开始我们的java接口, loadLibrary第一个参数就是你的dll名字,第二个就是当前接口的.class类型,接口里面的方法名要跟C的接口方法名一直


public interface TestJNA extends StdCallLibrary {

	public abstract int add(int a, int b);
	
	TestJNA INSTANCE = (TestJNA) Native.loadLibrary("test", TestJNA.class);
}

写完就调用测试下


public class TEST {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(TestJNA.INSTANCE.add(1, 2));
	}

}




目录
相关文章
|
Java 测试技术 C#
【开发者笔记】java 利用jna调用c#的dll
          一、需求阐述:   如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需求。
17412 0
|
7月前
|
Java API Android开发
Java通过JNI调用C++的DLL库
Java通过JNI调用C++的DLL库
44 0
|
Java
java.lang.UnsatisfiedLinkError: JNA support (com/sun/jna/android-arm/libjnidispatch.so) not found
java.lang.UnsatisfiedLinkError: JNA support (com/sun/jna/android-arm/libjnidispatch.so) not found
219 0
|
Java Linux C语言
linux下java 调用 c jni 实现 HelloWorld
1)首先写HelloWorld的java类 class HelloWorld { static { System.loadLibrary("HelloWorld"); } private native void print(); public static void main(String[] ar
1002 0
|
Java Linux C语言
java高级用法之:在JNA中将本地方法映射到JAVA代码中
java高级用法之:在JNA中将本地方法映射到JAVA代码中
|
监控 Java Linux
用JNA实现JAVA调用C语言中遇到的问题
因为计网大作业要求写一个网络流量监控系统,然后查阅资料后发现,计算机网络领域其实规定了了一组API接口规范供操作系统实现,这组API接口规范叫做PCAP(Packet Capture),Windows用winpcap(查阅后其实已经废弃了,现在用的是npcap)实现了该接口,linux用libpcap实现了该接口,由于个人比较喜欢用Java,所以必不可少的就是要养Java调用C了,这次调用C遇到了不少问题,这里说一下。
231 0
|
Linux
LINUX编译JNA产生jna.jar
LINUX编译JNA产生jna.jar
162 0
|
Java Linux C语言
java 通过jni调用linux so动态库
java 通过jni调用linux so动态库准备开发javaC++总结java 通过jni调用linux so动态库欢迎转载 地址:https://blog.csdn.net/qq_15122663/article/details/96732890 最近有个项目需要java调用C++的动态库,所以重温一下操作步骤记录一下。
3188 0
Java中使用JNI调用本地动态库的方法
在Java中,要使用动态库,就要使用到 JNI。首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
1372 0

热门文章

最新文章