java在主程序修改函数输出,Java通过JNI调用CUDA
——NG
这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索。我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是不可行的。
因为cuda程序涉及一个API接口的问题,直接使用JNI调用c/c++的方法来调用cuda是不可行的。在这上我走了不少弯路。然后我就想到能否使用cuda原生的dll支持来实现JNI调用cuda(cuda原生的dll只支持c/c++)。
接下来我们实现一下,当然首先你要懂JNI和cuda。
1.首先是前期工作,编写一个简单的java主程序java1.java,如下:
public class java1 {
static
{
System.loadLibrary("cudll");
}
public native static int cuda(int i);
public static void main(String[] args)
{
java1.cuda(4);
}
}
以上java程序要实现的是对cudll.dll的调用。然后javac成java1.class,再javah成java1.h头文件以方便接下来的调用。
2.然后就是cudll.dll的制作了。
看下图,首先通过CUDAWinApp建立cuda的dll工程:
建好后的工程如下:
其中头文件包括cuda的dll制作函数,源文件Project2.cpp和 stdafx.cpp是配置文件。最关键的是sample.cu文件和sample.def文件,一个是你要编写的dll主文件,一个是dll生成接口。如果是c调用的话不需要修改sample.def,但是通过java调用的话就要修改了。
3.然后就是最关键的具体dll编写了。首先要讲之前制作的java1.h拷贝到本工程的根目录以备调用。根据cuda官方提供的API可以编写代码,或者是直接根据sample的简单例子进行改写。
本文为简单使用默认的sample例子。当然你要改动一些地方:
将java1.h头文件包含到程序里面:
#include "java1.h"
然后别的代码包括内核不要动,修改主函数,将至改为JNI提供的接口函数:
JNIEXPORT jint JNICALL Java_java1_cuda (JNIEnv *, jclass, jint q)
其中Java_java1_cuda 为函数名,必须与你的java代码中的接口声明一一对应,q为传递的变量,根据具体情况添加,但是必须有。且要与java代码中的声明一致。
最后就是修改sample.def了,将至改为:
LIBRARY "Project2"
EXPORTS
Java_java1_cuda
看到了把,将主函数名修改为JNI提供要求的函数名。
4.最后是dll生成了,到这里所有准备工作就做好了,debug把,将生成的sample.dll拷贝到java代码的工程目录,改名为cudll.dll。然后运行java1.java,就会看到经典的cuda输出了:
CUDA initialized.
Processing time: 0.205585 (ms)
Hello CUDA!
//*
欢迎大家讨论交流:QQ798618048
*//
java在主程序修改函数输出,Java通过JNI调用CUDA相关推荐
- java.util接口_函数接口– Java 8中java.util.function包中的函数接口
java.util接口 我以前写过有关功能接口及其用法的文章. 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Su ...
- java一维数组正序输出,java将一个数组逆序输出-java将一个数组逆序输出的方法-吾爱编程网...
今天吾爱编程为大家分享一下Java的经典实例之一:java将一个数组逆序输出,有需要的小伙伴可以参考: 1.题目要求: 使用Java编程一个程序,将一个数组逆序输出 2.程序代码:public sta ...
- Java中测长函数_Core Java测试题
} 问:类Person和类Student的关系是( B ). A.包含关系 B.继承关系 C.关联关系 D.无关系,上述类定义有语法错误 9.设有下面的两个类定义: class AA { void S ...
- java 文件的修改_使用java来修改文件内容
我需要就地修改文件的特定内容. 我不想创建一个新文件并重写旧文件.文件也很小,每个最大只有几MB. 对于那些想知道的人(虽然我不确定这是否与OP有关),我需要修改属于版本控制的文件并需要修改只读版本. ...
- java整型数组转置输出,Java实现数组转置
public class DayE2 { public static void main(String[] args) { int [] datas=new int[]{1,2,3,4,5,6}; i ...
- java使用jna修改桌面_java - Java JNA获取桌面项目位置 - 堆栈内存溢出
问题是com.sun.jna.Native.getNativeSize(Class)不是在这种情况下使用的正确函数. 使用32位JVM时,问题是可见的(64位虚拟机不可见). 对于结构,上面提到的函数 ...
- java为什么监听器里没有输出,JAVA Web开发技术应用——监听器
额,代码竟然不显示 我再贴一下public class FirstListener implements ServletRequestListener { // Public constructor ...
- java实现pdf修改,或者在Java中使用iText pdf更改pdf页面的颜色
小编典典 虽然该问题的答案中给出的建议有效,但这并不是您可以获得的最佳建议.如果我早些时候看过您的原始问题,我将以不同的方式回答.我会建议您使用页面事件,如PageBackgrounds示例中那样. ...
- java 字符串输出字符_输出java字符串
1-1 字符串排序 用Java编写一个能对一组字符串按字典序升序排序的程序 输入为N和N行字符串,需要按行输出字符串升序排序的结果 如输入 3 Abc Abe Abd 输出: Abc Abd Abe ...
最新文章
- 谷歌开源NLP模型可视化工具LIT,模型训练不再「黑箱」
- 程序员最喜爱的12个Android应用开发框架二(转)
- OpenGL硬件加速指南
- 关于 Deployer 部署结构
- linux换源 最最简单
- 无法找到脚本库错误解决过程
- 结构化查询语言(Structured Query Language)
- Gargari and Permutations CodeForces - 463D(建图+记忆化搜索)
- quartz.net 执行后台任务
- 操作系统设计与实现 读笔(2)
- 用 Python 写一个 Kaggle 比赛排行榜的爬虫
- 支付宝架构到底有多牛逼?看完这篇你就明白了!
- 从C#程序中调用非受管DLLs
- java stream, LIST ,ArrayList常用操作
- 怎样背英语单词才高效?
- 基于elementui的年月日周时间控件
- ipad 在线打代码 code-server
- Vue项目实战05:18n实现多语言自动切换-浏览器语言设置
- 手机抠图怎么变透明底?这个抠图方法快收藏起来
- webpack常见面试题
热门文章
- 就在刚刚!吴恩达的这门新课程终于开放注册了
- SqlDataAdapter隐式打开关闭connection
- Delphi 与 C/C++ 数据类型对照表
- go语言游戏编程初识--`Ebiten`
- 使用FFmpeg实现抽取多媒体文件的音频并按照AAC格式进行保存--附源码
- 23种设计模式C++实现
- 结构体成员赋值-标记化结构体初始化语法-结构体成员前面加小数点
- (char*)malloc(sizeof(char))有什么用,为什么要这么写——简单介绍指针
- Hybrid app 学习资料收集
- Struts2学习总结一