`
junfeng279
  • 浏览: 3529 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java JNA 调C++

    博客分类:
  • java
 
阅读更多
1 上次那篇文件写了java JNi 调C++,这篇就把介绍下java JNA调c++

简单介绍下这个例子(参考网上)

1)在项目中定义Java 相关接口
public interface JavaToCppJNA extends Library{
	public int add(int a,int b);
	public int sub(int a,int b);
	public int mul(int a,int b);
	public int div(int a,int b);

	JavaToCppJNA INSTANCE = (JavaToCppJNA) Native.loadLibrary("JavaToCppJNA", JavaToCppJNA.class);
}

2)新建C++项目应用程序类型dll 附加项目:导出符号

//JAVATOCPPJNA.H
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 JAVATOCPPJNA1_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// JAVATOCPPJNA1_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef JAVATOCPPJNA1_EXPORTS
#define JAVATOCPPJNA1_API __declspec(dllexport)
#else
#define JAVATOCPPJNA1_API __declspec(dllimport)
#endif

// 此类是从 JavaToCppJNA1.dll 导出的
class JAVATOCPPJNA1_API CJavaToCppJNA1 {
public:
	CJavaToCppJNA1(void);
	// TODO: 在此添加您的方法。
};

extern JAVATOCPPJNA1_API int nJavaToCppJNA1;

extern "C" JAVATOCPPJNA1_API int add(int a,int b);
extern "C" JAVATOCPPJNA1_API int sub(int a,int b);
extern "C" JAVATOCPPJNA1_API int mul(int a,int b);
extern "C" JAVATOCPPJNA1_API int div(int a,int b);


注意.H和.cpp文件中的方法前应该有extern "C",如果没有的话在java中调用时会报
Exception in thread main noclassdeffounderror: error looking for function add
错误
// JavaToCppJNA1.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "JavaToCppJNA1.h"


// 这是导出变量的一个示例
JAVATOCPPJNA1_API int nJavaToCppJNA1=0;

// 这是导出函数的一个示例。
extern "C" JAVATOCPPJNA1_API int add(int a,int b)
{
	return a+b;
}

// 这是导出函数的一个示例。
extern "C" JAVATOCPPJNA1_API int sub(int a,int b)
{
	return a-b;
}

// 这是导出函数的一个示例。
extern "C" JAVATOCPPJNA1_API int mul(int a,int b)
{
	return a*b;
}

// 这是导出函数的一个示例。
extern "C" JAVATOCPPJNA1_API int div(int a,int b)
{
	return a/b;
}

// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 JavaToCppJNA1.h
CJavaToCppJNA1::CJavaToCppJNA1()
{
	return;
}
	


3)编译生成相应的dll文件,并将该文件拷贝到java工程目录下测试能够正常调用。
package com.test.demo;

public class Test {
	public static void main(String[] args) {
		JavaToCpp jtc = new JavaToCpp();
		System.out.println("3+4="+jtc.add(3, 4)); //测试JNI调用
		System.out.println(JavaToCppJNA.INSTANCE.add(5, 6)); //测试JNA调用
	}
}	


分享到:
评论

相关推荐

    java jna 调用pytorch c++模型推理

    Java JNA调用PyTorch C++模型推理是一种在Java应用程序中利用PyTorch的深度学习能力的方法。JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接调用本机库(如C++编写的库),而无需编写JNI(Java ...

    jna调用C++dll

    本示例将探讨如何使用JNA调用C++编写的动态链接库(DLL)以及如何实现从DLL到Java的回调功能。 首先,我们需要理解JNA的工作原理。JNA通过映射Java接口到C函数来实现调用。这些接口定义了C++ DLL中的函数签名,使得...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    在Java编程中,有时我们需要与C++...总之,JNA提供了灵活的方式让Java与C++库进行交互,但在处理复杂数据类型如二维数组时需要注意内存布局和数据转换。在实际项目中,应确保充分测试,保证在不同平台上都能正确运行。

    C++头文件转JAVA JNA接口类

    本篇文章将详细介绍如何将C++的头文件转换为Java的JNA接口类,以便于Java程序调用C++ DLL中的接口。 首先,我们需要理解JNA的工作原理。JNA通过定义Java接口来映射C/C++函数,并在运行时动态加载本地库,实现调用。...

    JNA 回调 范例 C++异步回调实现

    这几天搞搞JNA,主要是组内...C++部分使用ACE实现了一个线程,线程中调用Java部分的回调函数。 C++使用vc8开发,代码跨平台,不过偷懒,没写makefile, 其中使用了ACE这个库。 Java部分,使用eclipse。jdk1.5版本。

    jni调用C++动态库,jna调用C++动态库

    4. **回调支持**:JNA支持Java方法作为本地函数的回调,这在处理事件驱动或异步操作时非常有用。 5. **内存管理**:JNA自动管理内存,无需手动处理`NewGlobalRef`等操作,但需要注意的是,如果本地函数返回Java对象...

    java调用c++生成so库

    标签"jni java调c++"进一步强调了这是关于Java通过JNI调用C++的实践,通常用于性能敏感或需要访问特定系统功能的场景。在实际项目中,理解并熟练运用JNI可以极大地扩展Java应用的功能边界。 压缩包文件的文件名称...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

    c++ 代码实现 dll 工程 用于java jna调用

    本教程将详述如何使用C++编写DLL动态链接库,并通过Java的Java Native Access (JNA)库进行调用,从而实现Java程序对C++功能的调用。 首先,我们需要了解DLL是什么。DLL(Dynamic Link Library)是Windows操作系统中...

    如何使用JNA调用本地C/C++动态链接库详细示例代码

    详细演示了如何通过JNA实现以下形式的...5:函数指针和回调函数 6:字符串指针 7:输入一个数组 8:输出一个数组并释放空间 本资源包括三个工程: C++动态链接库; VC调用本地动态链接库; JNA调用本地动态链接库;

    JNA文件包-java调用c++

    JNA还支持回调函数,即Java方法作为C++函数的参数。这需要用到`Function`类和`Callback`接口。你需要定义一个实现了特定签名的`Callback`接口,并将其作为参数传递。 在实际应用中,可能会遇到性能问题,因为JNA的...

    java调用C++动态链接库dll接口

    本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...

    java_jna包

    JNA提供了一种方式,使得Java程序能够执行通常只能通过C/C++等本地语言完成的任务,如操作GUI元素、读写系统注册表、控制硬件设备等。 在JNA中,本地函数的调用是通过定义一个接口并使用`native`关键字来实现的。这...

    Java通过JNA调用系统API

    Java通过JNA调用系统API是一个实用的技术,它使得Java程序员能够充分利用操作系统的功能,而无需深入C/C++的世界。通过理解JNA的工作原理,以及如何定义接口和结构体来映射原生函数,你可以轻松地在Java中调用`...

    Android通过JNA调用C,C++方法

    Java Native Interface (JNI) 和 Java Native Access (JNA) 是两种主要的机制,允许Java代码调用C/C++函数。本篇文章将详细讲解如何在Android中使用JNA来调用C/C++方法。 首先,了解JNA的基本概念。JNA是一种轻量级...

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件和JNI(Java Native Interface)代码的需要。JNA提供了一种相对简单的方法来映射Java方法到本地函数调用,使得Java开发者能够轻松地访问操作系统的服务...

    JNA 转java接口以及指针结构体解析

    JNA通过提供一个映射机制,将Java方法与C/C++函数相对应,从而简化了跨平台的系统调用。在"JNA 转java接口以及指针结构体解析"这个主题中,我们将深入探讨如何使用JNA来处理C语言中的结构体和指针。 首先,理解JNA...

    JAVA-JNA简单使用

    JNA通过一种声明式的接口,使Java程序员可以方便地调用C、C++以及其他本地库中的函数,极大地简化了跨语言的互操作性。 标题“JAVA-JNA简单使用”指的是通过JNA在Java项目中调用本地系统API的过程。以下是一些关于...

    java用JNA调用dll实例,包含各种参数调用

    1. **基本数据类型**:JNA支持Java的基本数据类型如int、long、char等,这些类型会自动映射到C/C++的相应类型。例如,如果你的DLL函数有一个整型参数,直接在Java方法签名中使用int即可。 2. **指针和引用**:JNA...

Global site tag (gtag.js) - Google Analytics