- 浏览: 692442 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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的使用
0、先来看一下主要用到哪些函数:
官方文档:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp17440
JNI函数的中译本(貌似没看到GetPrimitiveArrayCritical()):http://blog.csdn.net/qinjuning
下面正式开始:
1、不知道如何设置JNI环境的先看这里:
http://cherishlc.iteye.com/blog/1328136
2、Java端程序:
Java端:
3、C++端程序:
GetIntArrayElements();//貌似得到的是副本,要拷贝数据 ReleaseIntArrayElements();//对应上面的函数的释放资源的函数 env->GetPrimitiveArrayCritical();//貌似得到的是指向原数据的指针 env->ReleasePrimitiveArrayCritical();////对应上面的函数的释放资源的函数
官方文档:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp17440
JNI函数的中译本(貌似没看到GetPrimitiveArrayCritical()):http://blog.csdn.net/qinjuning
下面正式开始:
1、不知道如何设置JNI环境的先看这里:
http://cherishlc.iteye.com/blog/1328136
2、Java端程序:
Java端:
package tests; import java.util.Arrays; public class TestJNIArray { static{ System.loadLibrary("TestJNIArray"); } public static native void addOne(int[] ints);//数组元素+1 public static native void addOne(double[] ints);//数组元素+1,为了测试,C++中循环了5次 public static native int[] getNewArray(int size,int initValue);//生成初始值为initValue的数组,数组长度为size public static void main(String[] args) throws InterruptedException { int n=20; final int[] a=new int[n]; for (int i = 0; i < a.length; i++) { a[i]=i; } if(n<50)System.out.println(Arrays.toString(a)); addOne(a); if(n<50)System.out.println(Arrays.toString(a)); final double d[]=new double[n]; for (int i = 0; i < d.length; i++) { d[i]=i; } //addOne(d); if(n<50)System.out.println(Arrays.toString(d)); new Thread(new Runnable() { @Override public void run() { addOne(d); } }).start(); for (int i = 0; i < 200; i++) { Thread.sleep(20); System.out.println(Arrays.toString(d)); if(d[d.length-1]-d[0]!=n-1)System.out.println("检测到C++端更新数据中");//看看能否找到在C++更新数组时Java端又读取数据的情况 } int[] b=getNewArray(2, 9); System.out.println(Arrays.toString(b)); int[] c=getNewArray(0, 9); System.out.println(Arrays.toString(c)); } }
3、C++端程序:
#include "tests_TestJNIArray.h" #include <windows.h> #include <time.h> #include <iostream> #include <string> class Timer{ private: clock_t time; public: Timer(){ time=clock(); } clock_t getElapsedTime(){ return clock()-time; } clock_t getElapsedTimeAndRestart(){ clock_t tmp=time; time=clock(); return time-tmp; } void restart(){ time=clock(); } int getCLOCKS_PER_SEC(){ return CLOCKS_PER_SEC; } }; JNIEXPORT void JNICALL Java_tests_TestJNIArray_addOne___3I( JNIEnv * env, jclass, jintArray intArray) { jboolean b; Timer timer; jint* pint=env->GetIntArrayElements(intArray,&b);//获取指针!!第二个参数可为NULL std::string str=b?"true":"false"; long t=timer.getElapsedTimeAndRestart(); std::cout<<"GetIntArrayElements()耗时: "<<t<<"\t为副本?"<<str<<std::endl;//很悲剧,自己得到的是副本(copy了一份,速度慢啊) jsize size=env->GetArrayLength(intArray); for (int i=0; i<size; i++) pint[i]+=1; env->ReleaseIntArrayElements(intArray,pint,0);//释放~~~ // 对于最后一个参数(如果指针指向的数组为副本时,否则该参数不起作用) // 0 copy back the content and free the elems buffer // JNI_COMMIT copy back the content but do not free the elems buffer // JNI_ABORT free the buffer without copying back the possible changes std::cout<<"从c++程序返回~"<<std::endl; } JNIEXPORT void JNICALL Java_tests_TestJNIArray_addOne___3D( JNIEnv * env, jclass, jdoubleArray intArray) { jboolean b; Timer timer; double* pd=(double*)env->GetPrimitiveArrayCritical(intArray,&b); //if(pd==NULL)return;理论上应该检查!!!! long t=timer.getElapsedTimeAndRestart(); jsize size=env->GetArrayLength(intArray); std::string str=b?"true":"false"; std::cout<<"GetPrimitiveArrayCritical()耗时: "<<t<<"\t为副本?"<<str<<std::endl;//这次是原始数据了,happy啊!!! for(int j=0;j<5;j++){ //验证一下,Java中的数据也在更新!!! Sleep(1000); for (int i=0; i<size; i++){ pd[i]+=1; Sleep(10); } } env->ReleasePrimitiveArrayCritical(intArray,pd,0);//别忘了释放~~~虽然不知道不释放有什么问题。。。 std::cout<<"从c++程序返回~"<<std::endl; } JNIEXPORT jintArray JNICALL Java_tests_TestJNIArray_getNewArray( JNIEnv * env, jclass, jint size, jint initValue ) { jintArray intArray= env->NewIntArray(size); jboolean* pb; //jint* pint=env->GetIntArrayElements(intArray,pb); jint* pint=new jint[size]; std::string str=*pb?"true":"false"; std::cout<<"自己生成的Java数组,取出指针,为副本?"<<str<<std::endl; for (int i=0; i<size; i++) { pint[i]=initValue; } env->ReleaseIntArrayElements(intArray,pint,JNI_COMMIT); delete []pint; //如果使用GetIntArrayElements()得到该指针则不可以!!!否则Java直接崩溃了 return intArray; }
发表评论
-
C++函数中的静态变量
2019-07-19 11:22 820在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 21771、使用第三方修改后的wormhole工程 原始工程wor ... -
C++中读取控制台输出,并将文件指针FILE*转换为istream
2017-11-27 15:03 1842解决的问题: 1、通过执行系统的bash命令后,获取其输出( ... -
c++中使用boost库在共享内存中存储map
2017-11-09 11:37 5429boost库中的interprocess包可以在共享内存中创建 ... -
近似最近邻算法库FLANN
2017-04-25 18:45 0FLANN库是计算近似最近邻的库, 问题定义如下: 给定距离函 ... -
C++杂记-- 重定向std::cout等
2017-04-18 17:28 19721、屏蔽std::cout 参见:http://stackov ... -
CMake指定目标代码的平台(win32,x64)
2016-06-03 20:54 11728主要参考自:http://blog.c ... -
windows 10下安装GPU版MXNet
2016-06-03 21:28 8591上回说到编译CPU版的MXNet: http://cheris ... -
windows下安装CPU版mxnet
2016-05-23 23:14 17596MXnet (mix net)类似Caffe,Tensorfl ... -
Linux C++编译及 静态/动态 链接库 笔记
2015-12-20 19:49 60561、C++文件的编译 g++参 ... -
Linux (Ubuntu) 下 Eclipse C++ 环境配置
2015-12-08 21:49 19601、安装JDK 参见http://blog.csdn.net/ ... -
Photoshop插件开发-filter
2015-10-11 22:53 3374初学,,感觉PS插件的文档很烂,,教程也很少,,也就这么简单学 ... -
使Visual Assist X支持CUDA的.cu文件的代码提示
2015-07-17 00:05 2305现在安装CUDA很方便了,直接支持Visual Studio。 ... -
CUDA程序block和thread超出硬件允许值时的异常
2015-07-13 11:32 3755调用CUDA的核函数时指定block 和 thread大小,该 ... -
创建及使用DLL
2014-09-29 15:22 1233此篇仅作简要的记录,作为备忘。 更为详细的可以参考:http: ... -
matlab的mexFunction中使用std::cout(部分转载)
2014-09-27 15:37 2163在matlab、C++混合编程的时候,可能会用到之前的代码。代 ... -
Eigen库:那些年我们一起经历的bug
2014-09-24 18:39 18631、使用auto声明新变量 ... -
C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
2014-09-24 09:48 2005调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了E ...
相关推荐
本篇文章将深入探讨如何在JNI中传递对象数组,包括字符串、整数和小数。 首先,我们需要了解JNI的基本架构。在Java层,我们创建一个本地方法声明,这个方法将被JNI调用。在C/C++层,我们实现这个本地方法,并通过...
本示例主要探讨如何在JNI中创建并返回一个对象数组到Java层。 首先,我们需要定义一个Java类,这个类将包含JNI方法的声明。例如,我们可能有一个`Person`类,表示一个人的信息: ```java public class Person { ...
JNI支持各种类型的数组,包括基本类型和引用类型。对于基本类型数组,如int[],可以使用`GetIntArrayElements()`获取原始C数组,操作完成后,使用`ReleaseIntArrayElements()`释放。对于引用类型数组,如String[],...
在本教程中,我们将探讨如何使用JNI来访问和操作简单类型数组,如整型、浮点型等。 首先,让我们了解JNI的基本结构。一个JNI程序通常包含两部分:Java源代码和本地源代码。Java源代码中定义了native方法,这些方法...
基本数据类型数组对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基本数据类型的使用类似。在 Android JNI 基础知识篇提到了 Java 数组类型对应的 JNI 数组类型。比如,Java int 数组对应了 ...
以上就是Android Studio中使用JNI传递数组的基本步骤。通过这种方式,开发者可以在C/C++层利用其高性能特性处理复杂计算,同时保持Java的易维护性和跨平台性。注意,使用JNI需要注意内存管理,避免内存泄漏和错误的...
这篇文档“JNI数组参数传递.docx”将深入探讨如何在JNI中有效地传递数组,包括输入参数和返回值。 首先,理解JNI的基本结构至关重要。JNI函数通常在C/C++中定义,然后通过Java的`native`关键字声明,最后通过`...
本“JNI数据传递demo”旨在演示如何在C/C++与Java之间传递基本数据类型、数组以及对象。 1. **基本数据类型传递**: JNI提供了对Java基本数据类型的映射,例如`jboolean`, `jbyte`, `jchar`, `jshort`, ` jint`, `...
而在JNI中处理数组,无论是基本类型数组还是对象数组,都需要特定的API和步骤。这里我们重点探讨JNI与数组交互的相关知识。 1. **初始化JNIEnv指针**:在C/C++代码中,首先需要通过`JNI_OnLoad`函数获取到`JNIEnv`...
文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据
08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08...
- **类型映射**: Java中的原始类型可以直接映射到C/C++的基本类型上,而复杂类型则需要通过JNI函数进行转换。 #### 三、结构体在JNI中的使用 在C/C++中,结构体是一种非常常用的数据组织形式。在JNI中,如果要在C/...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...
java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5. native向java传递数组...
在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...
在JNI中,传递基本类型(如int、float等)相对简单,直接通过参数即可。然而,处理复杂对象,如字符串、数组或自定义类,需要更多的步骤。对于Java字符串,我们可以使用`env->NewStringUTF`创建一个新的本地字符串,...
注意,由于JNA对复杂数据类型的处理有限,传递二维数组时,通常需要手动处理内存布局。在C++中,你可能需要提供一个辅助函数来处理Java传递过来的一维数组,转换为C++的二维数组格式。 此外,对于大型数据结构,...
JNI开发Java调用C传递int、String、Array类型参数; 详情参考: int类型: (https://blog.csdn.net/niuba123456/article/details/80959892) String类型(https://blog.csdn.net/niuba123456/article/details/80977247);...
总之,这个"android jni 中文字符传递demo"涵盖了在Android应用中使用JNI处理中文字符的核心技术,这对于那些需要在Java和C/C++之间交换中文数据的开发者来说,是一个非常有价值的参考资料。通过深入学习和实践这个...