Java 调用C 或者其他语言的方法-JNI

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

最近在使用JCuda,顺便研究了下JCuda的执行模式,利用JNI生成一个dll,dll中包含了对应CUDA API函数的使用,导入这个dll就可以再Java中进行CUDA操作,以及通过load module的方式执行CUDA kernel函数。

(转)

 先介绍一下jni:Java Native Interface,它能够使java和其他编程语言编写的应用程序和库进行相互操作。

       java中调用c函数,主要是通过本地化接口jni来实现的,在windows下,调用的是dll文件,在unix下,调用的是so文件。这里先介绍编写调用c函数的基本步骤:

      (1):编写.java文件,其中c中的函数要用public native static修饰。

      (2):编译.java文件为.class文件,使用javah生成.h文件。

      (3):按照.h文件中的函数形式在c中实现函数。

      (4):生成.dll文件,拷贝到java工程中。

      (5):运行java文件。

      注意以下几点:(1)如果java源文件放在包中,一定要在工程目录下使用javah命令。(2)在编写c函数时,要把jni.h和jni_md.h文件放在c的工程中。(3)在java文件中包含如下一句:static{System.loadLibrary("")},引号中为生成的动态连接库文件,不用加扩展名,系统会自动识别的。

JAVA调用DLL简单小例子 
这个小例子用JNI调用了VC++做的DLL动态库。

1、总体说明:
实现一个函数,传入整形数i,返回值i*i,这个函数做在DLL中,java将通过JNI调用这个函数,传入一个参数,得到返回值。
确定DLL的名称为calldll.dll,函数shanfei(int i)。

2、编写java程序javacall.java,如下:
public class javacall
{
static
{
System.loadLibrary("calldll");
}

public native static int shanfei(int i);

public static void main(String[] args)
{
javacall jc = new javacall();
int j;
j = jc.shanfei(4);
System.out.println(j);
}
}

3、编译
javac javacall.java

4、生成头文件
javah javacall
生成javacall.h文件

5、制作VC++动态库
建立新DLL工程,程序中添加:

#include "javacall.h"

JNIEXPORT jint JNICALL Java_javacall_shanfei (JNIEnv *, jclass, jint p)
{
int j = p*p;
return j;

别忘了将javacall.h复制到VC工程目录中,然后编译,如果编译说找不到jni.h文件,可以将jni.h复制到工程目录中,还可将javacall.h文件中的#include <jni.h>改为#include "jni.h",再编译。

 


6、java调用
将生成的calldll.dll文件复制到javacall.java所在的目录中,运行
java javacall,应该可以看到运行结果。


注意可能发生以下几种情况:
1、当你做到第6步时,发现calldll一直不能装载,则将calldll.dll拷贝到windows/system32/ 下即可
2、当找不到jni.h时即提示错误(fatal error C1083: Cannot open include file: 'jni.h': No such file or directory将以下文件:)/jdk/include/jni.h/jdk/
include/win32/jawt_md.h/
jdk/include/win32/jni_md.h
将以上三个文件复制到Visual Studio.net的安装目录下的/Vc7/include目录中)

JavaGPU编程-第一节-安装配置Jcuda JCuda的学习使用,配置教程 GPU编程 阅读详情

相关推荐

Mac下Java的native方法以及JNI调用C语言

1.native方法最近在读JDK NIO的源代码的时候发现了很多的native方法,这些方法都只给出了native修饰的定义,并没有给出实现体,并且也没有实现体,形式上和接口很类似。但是这些其实是特定的native方法,那么什么是native方法呢?下面给出以下示例://sun.nio.ch;包里面的IOUtil工具类下面有一些native方法 static native boolean rand

惜暮 9751

jcuda:JCuda-CUDAJava绑定

杰库达 JCuda-CUDAJava绑定 有关更多信息和构建说明,请参考 。

JNI C 语言中开启线程调用Java方法

Android 开发菜鸟,请大家多多指教!   1、 在C中直接调用与开启线程调用java方法是有所不同,这是由JNIEnv *env的使用限制引起的。      JNIEnv *env是一个结构体指针它指向JNI函数表,通过它能调用JNI所有函数来使用虚拟机的各种功能,例如;查找某个类(验证是否被VM加载、创建各种基本类数组、调用java方法等,它的方法几乎都是很有的),它是一个指向线程的局...

老衲想你的博客 2395

JCuda的环境配置、环境配置出现的错误及解决方案、编程思路

本文当介绍了JCuda及其环境配置、环境配置出现的错误及解决方案、编程思路

简单的JCuda使用示例,用于在GPU上计算两个向量的和

在上面的示例中,我们使用JCuda计算了两个向量的和。首先,在CPU上分配了两个向量和一个结果向量的内存,并将其初始化为相同的值。然后,我们使用JCuda将这些向量的数据复制到GPU上,并使用CUDA的Kernel函数计算向量的和。最后,我们使用JCuda将结果数据从GPU复制到CPU,并验证结果是否正确。此外,我们还使用JCudaDriver初始化CUDA和加载和运行CUDA的Kernel函数。

baeiou的专栏 1094

JCuda库安装配置

下载步骤 检查电脑是否有c++编译环境,没有则需要安装 . 检查电脑NVIDIA的Cuda驱动版本:控制面板->NVIDIA控制面板,驱动下载地址 https://www.nvidia.com/download/index.aspx?lang=en-us 下载Cuda:https://developer.nvidia.com/cuda-toolkit-archive 下载Jcuda:10....

Zeroowt的博客 1828

【亲测免费】 JCuda -Java语言访问CUDA的桥梁

JCuda -Java语言访问CUDA的桥梁 JCuda 是一个开源项目,旨在为Java开发者提供一种简单的方式来访问CUDA并行计算平台。该项目主要使用Java和C++语言开发。 1. 项目基础介绍 JCuda 是一组Java绑定,用于CUDA,允许Java程序通过JNIJava Native Interface)调用CUDA的API。CUDA是NVIDIA推出的一种并行计算平台和编程模型...

gitblog_00001的博客 659

JavaJCuda 以及JOGL安装 配置

以下内容亦有部分转载内容,如有冒犯请见谅 JCuda 可以将CUDA runtime 和driver api与java相连接,从而实现java程序调用GPU资源,进行并行加速的目的 具体介绍可参考http://www.jcuda.org/jcuda/JCuda.html 一。 安装JCUDA 1. 下载JCUDA libraries(注意此前电脑上应该已经安装CUDA的相应文件,并

amandasheng的专栏 6402

JNI,NATIVE,DLL,SO——了解Java如何与C/C++交互

** 前言 ** 由于Java语言的跨平台特性,使得它与本地语言和机器交互乏力,JNI为我们解决了这类难题。实际上从Java1.1开始,JNI标准已成为java平台的一部分。

Jonah的博客 445

Java Native Interface(JNI

JNI能让Java代码在Java虚拟机里调用其他编程语言(例如C、C++)写的应用或库,且不会影响任何Java虚拟机的实现。 什么时候用JNI? 1、应用程序所需的平台相关功能,标准的Java类库不支持时。 2、已经有一个用其他语言写的库,想要复用时。 3、想使用一些低级别的语言(例如汇编)实现部分关键代码时。 JNI问题 1、对开发者的要求更高。 2、丧失可移植性。 例子(C语言,on Mac...

weixin_34233421的博客 89

Java如何调用C程序,JNI技术

Java如何调用C语言程序,JNI技术 Java为什么要调用C语言编写的程序 因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语言去处理,然后Java调用C语言的接口。 使用Java如何去调用C语言的接口呢? 使用JavaJNI技术。 具体调用步骤 CentOS7环境下 首先创建Ja...

追风人的博客 2万+

jcuda实现的dbscan

jcuda DBSCAN运行步骤: 1. 首先服务器需要有NVIDIA显卡,因为CUDA是NVIDIA专用; 2. 需要安装CUDA驱动程序和工具包,可从 [NVIDIA CUDA下载网站](http://developer.nvidia.com/cuda-toolkit-archive)获取; 3. 安装了CUDA驱动程序和工具包之后,就可以运行示例代码了: 4. 将lib包下的JCuda-All-0.8.0-bin-linux-x86_64.zip包解压,里面包含了jcuda程序依赖的jar包和动态链接库; 5. 将根据需求编写的内核代码getNeighbors.cu,通过"nvcc -ptx getNeighbors.cu -o getNeighbors.ptx"类似的命令将内核代码进行编译; 6. 然后javac -Djava.ext.dirs="JCuda-All-0.8.0-bin-linux-x86_64" CudaGdbscan.javajavac -Djava.ext.dirs="JCuda-All-0.8.0-bin-linux-x86_64" Test.java分别编译; 7. 最后运行java -Djava.ext.dirs="JCuda-All-0.8.0-bin-linux-x86_64" Test

JCuda 基于javacuda开发包

java开发Cuda的包,需要nvidia支持和工具支持!

使用CUDA,Eclipse和JavaJCuda进行GPU计算

教程:使用JCuda和Nsight(Eclipse)进行GPU计算

通过JNI实现C语言调用Java方法的实用指南

Java Native Interface(JNI)是Java平台标准版的一部分,它为Java代码和其他语言编写的代码之间提供了一种交互机制。通过JNIJava程序员可以调用由C或C++等语言编写的本地应用程序接口(API)。在开始编写本地方法之前,首先要创建一个Java类,并在其中定义需要调用本地方法方法。在Java中,使用关键字native来声明本地方法。本地方法的实现将在C或C++代码中完成,但在Java类中,我们仅能提供一个方法的声明。

weixin_33582089的博客 978

JNI: C/C++调用Java方法

C/C++调用Java方法步骤: FindClass: 可以在C/C++层找到Java层的类 GetMethodID/GetFieldID:得到Java层中所有的类/属性 NewObject:创建对象,这个对象就代表内存中一个Java对象。有了这个对象之后,再通过GetMethodID/GetFieldId取到的MethodID(其实它就是个索引值)/FieldID,类中这个方法/属性的索...

手写我对你的温柔 5139

java通过JNI调用DLL文件

JNI简介: JNIJava Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。允许Java代码和其他语言写的代码进行交互。JNI是JDK提供的一个native编程接口。JNI 允许Java程序调用其他语言编写的程序或者代码库, 比如C/C++。Java 在内存管理和性能上有一定的局限,通过JNI我们就可以利用Native程...

Mr.小强的博客 1万+

c jni 调用java_JNI基础 c语言调用java无参方法

利用c语言调用java无参的方法java方法//打印public void sayHelloFromJava(){System.out.println("sayHelloFromJava");}//c调用java中带两个参数的方法public int javaAdd(int x,int y){return x + y;}//c调用java中参数为String的方法public void print...

weixin_35123329的博客 3179

android studio 调用jni,实现Java调用C语言程序

思路可能有些问题,但是方法是正确的,如有遇到不通的地方,可以留言提问。 1. 新建工程。新建工程的时候,按照普通新建工程的方法就可以。 2.新建的工程切换到Project视图下,在main文件夹新建JNI Folder,也可以新建一个Project. 3. 在MainActivity中新建一个native方法。 例如: public native String 方法名A(); public

三石的专栏 3583
上一篇: 5.23-5.27规划
下一篇: Android JNI编程指南及模拟器配置问题(LINUX)
jack_incredible
博客等级 码龄17年 82粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值