- 浏览: 677747 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
1、来个java程序,本地方法前加native关键字
2.生成C++头文件
简单方法见http://cherishlc.iteye.com/blog/1326893
生成的头文件如下
3.写C++端的实现
新建vs的win32工程:
接下来选择DLL工程:
加入刚刚生成的头文件;写实现函数的cpp文件,写导出函数的.def文件:
注意:64位的JVM需要64位的DLL!!
设置方法: VS下设置如下:
点击工具栏上的配置编译的平台的工具栏的向下的箭头:
选择所需工程,点击之:
选择x64架构,点ok,搞定!!
注意:jni.h的路径要加进来,你懂的:
注意:还是老老实实用.def文件定义导出函数吧!不这样函数名可能会被编译器改掉!!!
4.编译,将生成的dll文件考到当前路径下(在Eclipse中运行即为工程文件所在路径),运行java程序,一切OK
注意:别忘了java类里要加载DLL“static {System.loadLibrary("TestJNI_201112");}”! 不带后缀!
5.进阶:
Jni中C++和Java的参数传递http://www.blogjava.net/china-qd/archive/2006/04/29/44002.html
Java Native Interface Specification:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
6.在Java中用C++的类:
只是想到一个小技巧:
声明一个所需类的全局指针变量,需要时new一下, 不需要时delete之;缺点是只能用一个啊! 当然用个vector之类的记录当前活动的自然可以,可是多了一层,速度受影响吧!!
部分代码如下:
7.调试记录:
一开始程序经常崩溃,只说是C++端的错误。
后来看到下面的error log,至少知道是Graph<long,long,__int64>::add_edge出错,后来发现其中有assert语句,检查下标越界,感觉是自己写的时候下标越界了,在java里调用add_edge的地方增添了句检查下标越界的操作,越界时抛出异常:throw new RuntimeException("x = "+x+"\ty = "+y+"\t varNum = "+getVarNum());
果然问题出在下标上!!!
后来发现自己存不同下标的变量太多,有一处弄混了!!
public class HelloWorld_20111226 { public static native void printHelloWorld(); public static native int add(int a, int b); static { System.loadLibrary("TestJNI_201112"); } public static void main(String[] args) { printHelloWorld(); int sum = add(1, 2); System.out.println(sum); } }
2.生成C++头文件
命令行下 javah 类名(在.class的根路径下 包名.类名,无需后缀)
简单方法见http://cherishlc.iteye.com/blog/1326893
生成的头文件如下
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld_20111226 */ #ifndef _Included_HelloWorld_20111226 #define _Included_HelloWorld_20111226 #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld_20111226 * Method: printHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_120111226_printHelloWorld (JNIEnv *, jclass); /* * Class: HelloWorld_20111226 * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_HelloWorld_120111226_add (JNIEnv *, jclass, jint, jint); #ifdef __cplusplus } #endif #endif
3.写C++端的实现
新建vs的win32工程:
接下来选择DLL工程:
加入刚刚生成的头文件;写实现函数的cpp文件,写导出函数的.def文件:
#include "HelloWorld_20111226.h" #include <iostream> JNIEXPORT void JNICALL Java_HelloWorld_120111226_printHelloWorld( JNIEnv *, jclass ) { std::cout<<"Hello world"<<std::endl; } JNIEXPORT jint JNICALL Java_HelloWorld_120111226_add( JNIEnv *, jclass, jint a, jint b) { return a+b; }
注意:64位的JVM需要64位的DLL!!
设置方法: VS下设置如下:
点击工具栏上的配置编译的平台的工具栏的向下的箭头:
选择所需工程,点击之:
选择x64架构,点ok,搞定!!
注意:jni.h的路径要加进来,你懂的:
注意:还是老老实实用.def文件定义导出函数吧!不这样函数名可能会被编译器改掉!!!
//main.def文件如下: LIBRARY "TestJNI_201112" EXPORTS Java_HelloWorld_120111226_printHelloWorld Java_HelloWorld_120111226_add Java_LC_TestJNI_printInt Java_LC_TestJNI_printIntArray
4.编译,将生成的dll文件考到当前路径下(在Eclipse中运行即为工程文件所在路径),运行java程序,一切OK
注意:别忘了java类里要加载DLL“static {System.loadLibrary("TestJNI_201112");}”! 不带后缀!
5.进阶:
Jni中C++和Java的参数传递http://www.blogjava.net/china-qd/archive/2006/04/29/44002.html
Java Native Interface Specification:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
6.在Java中用C++的类:
只是想到一个小技巧:
声明一个所需类的全局指针变量,需要时new一下, 不需要时delete之;缺点是只能用一个啊! 当然用个vector之类的记录当前活动的自然可以,可是多了一层,速度受影响吧!!
部分代码如下:
#include "Maxflow/LCEnergyMinimize_Graph.h" #include "GraphMinimization_GraphCut.h" typedef LCEnergyMinimize_Graph<jint,jlong> GraphIntLong; GraphIntLong* g; JNIEXPORT void JNICALL Java_GraphMinimization_GraphCut_generateGraph( JNIEnv *, jobject ) { if(g!=NULL)delete g; g=new GraphIntLong(); } /* * Class: GraphMinimization_GraphCut * Method: releaseGraph * Signature: ()V */ JNIEXPORT void JNICALL Java_GraphMinimization_GraphCut_releaseGraph (JNIEnv *, jobject){ if(g!=NULL)delete g; g=NULL; } /* * Class: GraphMinimization_GraphCut * Method: addVariable * Signature: (I)I */ JNIEXPORT jint JNICALL Java_GraphMinimization_GraphCut_addVariable (JNIEnv *, jobject, jint num){ return g->addVariable(num); }
7.调试记录:
一开始程序经常崩溃,只说是C++端的错误。
后来看到下面的error log,至少知道是Graph<long,long,__int64>::add_edge出错,后来发现其中有assert语句,检查下标越界,感觉是自己写的时候下标越界了,在java里调用add_edge的地方增添了句检查下标越界的操作,越界时抛出异常:throw new RuntimeException("x = "+x+"\ty = "+y+"\t varNum = "+getVarNum());
果然问题出在下标上!!!
后来发现自己存不同下标的变量太多,有一处弄混了!!
Stack: [0x0000000001ca0000,0x0000000001da0000], sp=0x0000000001d9f750, free space=1021k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [MaxflowJNIInterface.dll+0x1a74] Graph<long,long,__int64>::add_edge+0x74 Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) J GraphMinimization.GraphCut.addTerm2(IIIIII)V J app.StereoCorrespodenceUsingGraphCut.generateStereoCorrespodenceGraph(Llc/util/image/IntPair;)LGraphMinimization/GraphCut; j app.StereoCorrespodenceUsingGraphCut.calculate()V+52 j app.StereoCorrespodenceUsingGraphCut.main([Ljava/lang/String;)V+62 v ~StubRoutines::call_stub
发表评论
-
C++函数中的静态变量
2019-07-19 11:22 754在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp ... -
tensorflow 静态编译笔记 -- linux系统
2018-11-05 14:26 0注: 1、编译tensorflow静态库 很简单,参见: h ... -
gperftools笔记
2018-06-27 14:30 0export LD_LIBRARY_PATH=LD_LIBR ... -
dmlc分布式线性模型编译笔记
2018-06-06 10:37 21001、使用第三方修改后的wormhole工程 原始工程wor ... -
C++中读取控制台输出,并将文件指针FILE*转换为istream
2017-11-27 15:03 1700解决的问题: 1、通过执行系统的bash命令后,获取其输出( ... -
c++中使用boost库在共享内存中存储map
2017-11-09 11:37 5076boost库中的interprocess包可以在共享内存中创建 ... -
近似最近邻算法库FLANN
2017-04-25 18:45 0FLANN库是计算近似最近邻的库, 问题定义如下: 给定距离函 ... -
C++杂记-- 重定向std::cout等
2017-04-18 17:28 18791、屏蔽std::cout 参见:http://stackov ... -
CMake指定目标代码的平台(win32,x64)
2016-06-03 20:54 11512主要参考自:http://blog.c ... -
windows 10下安装GPU版MXNet
2016-06-03 21:28 8518上回说到编译CPU版的MXNet: http://cheris ... -
windows下安装CPU版mxnet
2016-05-23 23:14 17475MXnet (mix net)类似Caffe,Tensorfl ... -
Linux C++编译及 静态/动态 链接库 笔记
2015-12-20 19:49 59691、C++文件的编译 g++参 ... -
Linux (Ubuntu) 下 Eclipse C++ 环境配置
2015-12-08 21:49 19111、安装JDK 参见http://blog.csdn.net/ ... -
Photoshop插件开发-filter
2015-10-11 22:53 3295初学,,感觉PS插件的文档很烂,,教程也很少,,也就这么简单学 ... -
使Visual Assist X支持CUDA的.cu文件的代码提示
2015-07-17 00:05 2216现在安装CUDA很方便了,直接支持Visual Studio。 ... -
CUDA程序block和thread超出硬件允许值时的异常
2015-07-13 11:32 3672调用CUDA的核函数时指定block 和 thread大小,该 ... -
创建及使用DLL
2014-09-29 15:22 1188此篇仅作简要的记录,作为备忘。 更为详细的可以参考:http: ... -
matlab的mexFunction中使用std::cout(部分转载)
2014-09-27 15:37 2117在matlab、C++混合编程的时候,可能会用到之前的代码。代 ... -
Eigen库:那些年我们一起经历的bug
2014-09-24 18:39 17621、使用auto声明新变量 ... -
C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
2014-09-24 09:48 1887调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了E ...
相关推荐
JNI学习笔记 jni开发资料 使用Android studio 写JNI,适合初学者入门学习
JNI学习笔记.doc
android JNI 学习笔记 android JNI 学习笔记.doc
JNI学习笔记,对学习android帮助极大
针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------
做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。
1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换
项目四 多线程文件下载 25 项目五 Android自定义树形菜单 26 项目六 高仿微信聊天 26 ...学习四 Android and MCU Communication 43 一、 uses USB via FTDI serial card 43 二、 uses Uart(through JNI) 44
android jni base64 和 java base64 通用代码及base64 so文件
JNI编译环境配置,在windows下亲自实验有效!
ndk jni的学习
以helloworld实例详细讲解了jni的配置方法,主要是针对jni的初学者
JNI的学习资料,网上收集的,自己把它转成了doc格式
集成ndk,一个简单的Jni工程包括个人学习笔记
这是一个androidstudio环境下的jni的学习,里面包含了基本数据类型转化,引用数据类型转化,json格式数据类型的转化等
android JNI学习三的最后代码实例
本书有一部分是JAVA2平台上面的JNI特征的规范说明。JNI程序员可以把这部分用作一个手册。JVM开发者在实现虚拟机的时候必须遵守这些规范。 JNI的部分设计思想来源于Netscape的Java Runtime Interface(JRI)。 第一章 ...