利用JNA从Java调用C++
************* 建立VC工程,创建dll *********
--》javaCallCpp.h
extern "C" _declspec(dllexport) void hello();
extern "C" _declspec(dllexport) int add(int first, int second);
--》javaCallCpp.cpp
#include "javaCallCpp.h"
#include <iostream>
int add(int a, int b){
return a+b;
}
void hello()
{
printf("Hello World!\n");
}
************* 建立Java工程,调用dll *********
--》JavaCallCppService.java
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface JavaCallCppService extends Library {
//javaCallCpp.dll 放到工程目录下才行(与.classpath一级),也可以放到C:\WINDOWS\system32下,放到classes下会报找不到库
JavaCallCppService INSTANCE = (JavaCallCppService)Native.loadLibrary("javaCallCpp", JavaCallCppService.class);
public int add(int a, int b);
public void hello();
}
--》JavaCallCppTest.java
public class JavaCallCppTest {
public static void main(String[] args) {
System.out.println(JavaCallCppService.INSTANCE.add(1,2));
JavaCallCppService.INSTANCE.hello();
}
}
************* 需要注意的地方 *********
--》javaCallCpp.dll 放到工程目录下才行(与.classpath一级),也可以放到C:\WINDOWS\system32下,放到classes下会报找不到库;
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'javaCallCpp': 找不到指定的模块。
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:169)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:242)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:368)
at com.sun.jna.Native.loadLibrary(Native.java:353)
at JavaCallCppService.<clinit>(JavaCallCppService.java:5)
at JavaCallCppTest.main(JavaCallCppTest.java:4)
--》在头文件中必须为每个要公开调用的方法声明 extern "C" _declspec(dllexport),否则会java调用报找不到这个函数
参考:http://blog.csdn.net/shadowsick/article/details/9101477#
http://blog.csdn.net/shendl/article/details/3589676/
http://wen866595.iteye.com/blog/974826
分享到:
相关推荐
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生API...通过学习和实践这个"jna调用C++ dll"的例子,你将能够熟练地处理跨语言的交互,包括处理回调函数这样的高级特性。
Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...
jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态...
Java JNA调用PyTorch C++模型推理是一种在Java应用程序中利用PyTorch的深度学习能力的方法。JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接调用本机库(如C++编写的库),而无需编写JNI(Java ...
在标题和描述中提到的“JNA调用dll jna调用c++”是指利用JNA来调用Windows系统中的动态链接库(.dll)文件,这些.dll文件通常由C++或其他支持编译为本地代码的语言编写。 本文将详细介绍如何使用JNA进行dll调用,并...
在Java编程中,有时我们需要与C++库进行交互,特别是在处理底层系统操作或者利用已有的C++库资源时。Java Native Access (JNA) 是一个非常实用的框架,它允许Java程序直接调用本地(Native)代码,无需编写JNI(Java ...
标题中的"jna-4.2.2.jar"和"jna-platform-4.2.2.jar"是Java Native Access (JNA)框架的两个关键组件的版本号为4.2.2的JAR文件。JNA是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
在IT行业中,跨语言通信是常见的需求之一,Java与C++的交互就是一个典型的例子。本教程将详述如何使用C++编写DLL动态链接库,并通过Java的Java Native Access (JNA)库进行调用,从而实现Java程序对C++功能的调用。 ...
jna-4.0.0.jar (用于Java调用C++ DLL动态库)
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写C/C++的JNI(Java Native Interface)代码,即可直接...对于任何需要与本地系统功能进行交互的Java项目,JNA都是一个值得考虑的解决方案。
Java Native Access (JNA) 是一个Java库,允许Java程序与本地平台API进行交互,而无需编写JNI(Java Native Interface)代码。JNA Platform是JNA的一个扩展,提供了对特定操作系统功能的访问,特别是针对Windows、...
这个文件包专注于讲解如何使用JNA来调用C++函数,这对于那些需要利用C++库功能但又希望保持Java应用程序的跨平台特性的开发者来说,是非常有用的。 首先,我们要理解JNA的基本工作原理。JNA通过映射Java方法到本地...
在Linux系统下,JAVA程序通过JNA技术实现调用C语言编程输出的so库接口函数,从而实现java程序与c程序之间的交互。
总结来说,"jna-5.6.0.jar"和"jna-platform-5.6.0.jar"是Java开发者调用C++ DLL文件的关键工具,它们提供了一个高效、便捷的桥梁,使得Java程序能够充分利用本地系统的功能,而无需深入JNI的复杂性。这两个库不仅...
### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...
swig -java -c++ mycppheader.i ``` 这将会生成两个文件:`mycppheader_wrap.cxx`(编译成动态链接库的源码)和`mycppheader.java`(JNA接口类)。 4. **编译动态链接库**:使用C++编译器(如g++或MSVC)编译`...
通过学习和理解这个例子,开发者可以掌握如何在Java应用中利用JNA来与不同平台的本地库进行交互,这对于跨平台的开发工作尤其有价值。同时,也能了解如何使用大华SDK进行视频播放和其他监控设备相关的功能开发。
Java语言在与操作系统底层交互时,通常会遇到需要调用动态链接库(DLL)的情况,尤其是在Windows平台上。Java Native Access(JNA)是Java平台上的一个开源库,它提供了直接调用系统DLL函数的能力,无需编写C代码...
在Java编程环境中,有时我们需要利用C++的高性能特性来处理特定任务,比如访问硬件设备、进行底层优化等。这时,我们可以使用Java Native Interface (JNI) 来实现Java代码与C++代码的交互。JNI允许Java应用程序调用...