android - JNI - 一维数组、二维数组的访问与使用

在Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细) TinyWebServer是个什么项目?它是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器。使用线程池+非阻塞socket+epoll(ET和LT均实现) +事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机解析HTTP请求报文,支持解析GET和POST请求访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件实现同步/异步日志系统,记录服务器运行状态。...... 阅读详情

在JNI中访问JAVA类中的整型、浮点型、字符型的数据比较简单,举一个简单的例子,如下:

[java]  view plain copy
  1. //得到类名  
  2. jclass cls = (*env)->GetObjectClass(env, obj);  
  3. //得到Java类中的变量Number  
  4. jfieldID fNumber = (*env)->GetStaticFieldID(env, cls, "Number", "I");  
  5. //将JNI中也就是C代码中的nJniNumber的值设置到fNumber中,其实也就将值设置给Java类中的Number  
  6. (*env)->SetStaticIntField(env, cls, fNumber, nJniNumber);  

但是对于一维数组和二维数组在JNI中的使用方法跟上面的有一定的差别,也有点麻烦,下面我们就看看怎么使用。

在网上找到的一段代码,基上显示了JNI中二维数组的使用,觉得不错,我又将代码进行了一些整理,如下:

[cpp]  view plain copy
  1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData)      
  2. {   
  3.    
  4.       jint i,j;    
  5.     
  6.       int row = (*env)->GetArrayLength(env, arrayData);//获得行数      
  7.   
  8.       jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, 0));    
  9.     
  10.       int col =(*env)->GetArrayLength(env, myarray); //获得列数    
  11.     
  12.       jint jniData[row][col];         
  13.     
  14.       for (i = 0; i < row; i++){    
  15.     
  16.           myarray = ((*env)->GetObjectArrayElement(env, arrayData, i));    
  17.     
  18.           jint *coldata = (*env)->GetIntArrayElements(env, (jintArray)myarray, 0 );    
  19.     
  20.           for (j=0; j<col; j++) {    
  21.               jniData [i] [j] = coldata[j]; //取出JAVA类中arrayData的数据,并赋值给JNI中的数组  
  22.           }    
  23.   
  24.          (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 );  
  25.     
  26.       }    
  27.     
  28. }    

其中,arrayData是通过参数将Java中定义的一个二维数组int[][] testArray = new int[50][50]传递过来的;


一、在上面例子中只是得到数组中的数据,那么如何设置数组中的数据呢? 我们来看一下下面的代码:

[cpp]  view plain copy
  1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData)    
  2. {  
  3.      jin i,j;  
  4.   
  5.      jint count = 10;  
  6.   
  7.      jint jniData[10][10];  
  8.   
  9.   
  10.      for(i=0; i < count; i++)  
  11.      {  
  12.          for(j = 0 ; i < count; j++  
  13.          {  
  14.              jniData[i][j] = i*(i+j);  
  15.          }  
  16.      }  
  17.   
  18.      for (i = 0; i < row; i++){   
  19.      {  
  20.          //得到数组的首地址  
  21.          jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, i));  
  22.            
  23.          //将jni数组的count个元素复制给myarray数组  
  24.          (*env)->SetIntArrayRegion(env, myarray, 0, count,jniData[i]);  
  25.           
  26.          (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 );  
  27.      }  
  28. }  

如果arrayData是一维数组的话,将上面的for循环去掉就可以了。


二、一维的字符串数组怎么设置数据呢?我们来看下面的代码:

[cpp]  view plain copy
  1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData)    
  2. {  
  3.      jin i;  
  4.   
  5.      char temp[100];  
  6.       
  7.      jint count = (*env)->GetArrayLength(env, arrayStringData);  
  8.   
  9.      for (i = 0; i < count; i++){   
  10.      {  
  11.          memset(temp,0,100);  
  12.          sprintf(temp,"str:%d",i);  
  13.          
  14.          //得到一个jstring的数据  
  15.          jstring str = (*env)->NewStringUTF(env, temp);  
  16.   
  17.          //将str设置给arrayStringData的第i个元素。  
  18.          (*env)->SetObjectArrayElement(env, arrayStringData, i, str);  
  19.      }  
  20. }  

其中,arrayStringData是通过参将Java中定义的一个一维数组String[] testArray = new String[50]传递过的;


三、二维的字符串数据怎么设置数据?请看下面的代码:

[cpp]  view plain copy
  1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData)    
  2. {  
  3.      jin i,j;   
  4.   
  5.      char temp[100];  
  6.   
  7.      jint count = (*env)->GetArrayLength(env, arrayStringData);  
  8.   
  9.      for (i = 0; i < count; i++){   
  10.      {  
  11.          //得到一行数据  
  12.      jarray myarray = ((*env)->GetObjectArrayElement(env, arrayStringData, i));  
  13.            
  14.          jint count1 = (*env)->GetArrayLength(env,myarray);  
  15.          for(j=0; j < count1; j++)  
  16.          {  
  17.              memset(temp,0,100);  
  18.              sprintf(temp,"str:%d",i*(i+j));  
  19.   
  20.              //得到一个jstring的数据  
  21.              jstring str = (*env)->NewStringUTF(env, temp);  
  22.   
  23.              //将str设置给arrayStringData的第j个元素。  
  24.              (*env)->SetObjectArrayElement(env, myarray, j, str);  
  25.          }  
  26.      }  
  27. }  

其中,arrayStringData是通过参数将Java中定义的一个二维数组String[][] testArray = new String[50][50]传递过的。


四、上面的访问数组的方法都是通过参数传递的方式实现的,如何不通过参数传递在JNI中直接得到数组进行操作呢?
我在网上查找相关的资料和文章,也有这方面的介绍,我在使用他们的方法时,程序总是出错,不知道什么原因,因此,至今仍然没有搞明白怎样才能够不通过参数传递的方式直接访问JAVA中的数组。
我在论坛中发过贴子,也没有找到相应的方法,论坛的贴子如下:

http://topic.youkuaiyun.com/u/20120315/10/f956498c-ed93-4d4f-bfb2-cc1719de61d7.html


如果你有什么好的见意的话,可以给我私信或留言,谢谢。



手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界 Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。 阅读详情

相关推荐

使用 ANSYS AEDT(双向耦合)对高功率射频同轴滤波器进行热分析

使用 ANSYS HFSS,可以精确计算 EM 损耗,然后将其导入 ANSYS 热分析并使用 ANSYS Icepak CFD 求解器进行仿真,以帮助工程师解决最复杂的热挑战,并预测其设计在温度变化下的表现。然后,RF 损耗将与 ANSYS Icepak CFD 求解器耦合,以执行热分析,包括传热的传导、对流和辐射模式,并计算温度曲线。在此演示中,我们将仿真下面的 RF 同轴滤波器,并计算由于所用材料的有限电导率和介电损耗而导致的 RF 传导损耗。设置 HFSS 设计后,我们可以开始 HFSS 仿真。

jkh920184196的博客 1051

jni对一维数组的处理

jni对java一维数组的方法比较实用的有几个 xxx具体用其他数据类型替换 byte对应char java的char对应c++wchar NewxxxArray新建java的一维数组 SetxxxArrayRegion用c++数组值赋值给java数组 GetArrayLength...

u014493323的博客 215

CTF-Web学习笔记:服务端请求伪造(SSRF)篇

本文系统介绍了CTF比赛中SSRF漏洞的攻防技术。首先解析了SSRF的核心原理,即利用服务器对用户输入URL的未校验缺陷,诱导其访问内网资源。然后详细分析了5类常见CTF题型:文件读取、内网探测、云服务元数据窃取、协议绕过及组合漏洞利用。重点讲解了绕过URL过滤、利用特殊协议(如dict://、gopher://)等实战技巧,并通过一道SSRF+Redis的高阶题目演示完整攻击链。最后给出防御建议:严格校验输入URL、禁用危险协议、实施内网隔离等。

Deng7326的博客 1704

JNI 返回二维、三维,char、float、int、long型数组到java层

/* DO NOT EDIT THIS FILE - it is machine generated */ #include #include #include #include "local_client_select.h" #include "array_buffer.h" #include "Interface_Module.h" #include "airmovegesture_co

谢文浩博客 4081

IPSec案例部署

步骤二:按照规划划分vlan并开启vlanif接口,配置链路类型实现vlan之间的互通。步骤2 :配置OSPF实现公司内部通信,配置静态路由实现AR1和AR3路由可达。3. 配置IPSec的安全联盟(协商业务数据加密时使用的参数)下发缺省路由,使网关设备有去往对端的路由‘配置对等体IP地址,即分公司的出口IP。步骤1:设备重命名以及IP地址的配置。步骤4:配置NAT,实现内网访问外网。步骤3:配置IPSec VPN。5.调用IPSec的安全策略。发了5个包 加密5个包。

2301_76769137的博客 1694

手把手教你用CODESYS将旧笔记本改造成软PLC(含证书配置避坑指南)

本文提供了一份详尽的指南,教你如何利用CODESYS平台将闲置旧笔记本改造为一台功能完整的软PLC。内容涵盖从硬件评估、系统实时性优化、软件安装与驱动配置,到关键的证书授权管理避坑指南,旨在帮助自动化工程师和爱好者低成本搭建稳定可靠的学习与开发平台。

weixin_29190573的博客 279

JNI编程中关于二维数组编程

JNI 返回一个二维数组 1.构建一个一维数组对象, 2.构建一个数组对象的数组 3.对每一个对象的数组的每一个元素赋值(对象只能对一个元素进行Get/Set方法,不能Region)

yuzhihui170的专栏 1177

点云PCL库学习-双目图像转化为点云PCD并显示

文章目录 双目视觉模型 代码实现 总结 参考文章 一、双目视觉模型 和RGBD相机主动发射光线实现测距不同,双目测距原理通过配置立体摄像头(通常由左眼相机和右眼相机两个水平放置的相机组成)来获取一对同一场景中的二维图像,再基于同一空间点在两个坐标系下的视差来计算深度。双目测距的示意图和数学表达式如下所示: 双目相机的成像示意图 上述示意图描述了一个空间点在左右两目相机中位置之间的成像关系,根据相似三角形原理可得: 其中,f和b分别为相机焦距和双目相机基线,d为空间点在两个坐标系下

weixin_41957687的博客 6948

JNA处理二维数组

细细品读这张图就恍然大悟了

qq_38274392的博客 960

BPMN2.0规范及流程引擎选型方案

本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。

比特桃 1万+

Android功耗系列专题理论之一:功耗优化分析思路简介

本文系统介绍了电子系统功耗分析方法,涵盖静态与动态功耗原理、电流波形分析技术和模块化拆解策略。重点阐述了PMIC与CPU协同管理机制、DVFS动态调节技术,以及通过示波器捕获波形特征定位异常的方法。针对亮屏等典型场景,提出三阶段对比分析法,并详细说明硬件/软件拆解方案及混合验证策略。文章还总结了常见问题模块(CPU、多媒体、外设)的排查流程,强调需结合日志分析、温度控制及重复测试确保数据可靠性,为功耗优化提供系统化解决方案。

1459

android JNI 一维数组、二维数组的访问与使用

在JNI中访问JAVA类中的整型、浮点型、字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj); //得到Java类中的变量Number jfieldID fNumber = (*env)->GetStaticFieldID(env, cls, "Number", "I...

weixin_30273931的博客 91

YOLOv9电力巡检实战:绝缘子破裂/鸟巢识别+无人机自动定位

摘要:本文聚焦电力输电线路巡检的效率与安全痛点,提出基于YOLOv9与无人机的智能巡检解决方案。针对绝缘子破裂、鸟巢等高危缺陷,通过“无人机改装-模型训练-缺陷识别-工单生成”四阶段工程落地流程,实现全自动化巡检。系统采用大疆M300无人机搭载RTK模块与Jetson边缘计算盒,结合改进YOLOv9模型实时识别5类缺陷,通过4G传输将GPS定位与缺陷数据同步至工单系统。实测表明,该方案巡检效率达50公里/天(较人工提升10倍),缺陷发现率95%(提升40%),事故预防率98%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1511

Android深入理解JNI(一)JNI 静态注册与动态注册

前言JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。1.JNI概述Android系统按语言来划分的话由两个世界组成,分别是Java世界和Native世界。那为什么要这么划分呢?Android系统由Java写不好吗?除了性能的之外,最主要的原因就是在Java...

q610098308的专栏 1179

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JNI原理及常用方法概述

JNIEnv概念 :JNIEnv是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境。通过JNIEnv可以调用到一系列JNI系统函数。JNIEnv线程相关性:每个线程中都有一个 JNIEnv 指针。JNIEnv只在其所在线程有效, 它不能在线程之间进行传递。注意:在C++创建的子线程中获取JNIEnv,要通过调用JavaVM的AttachCurrentThread函数获得。

Easyhood的博客 3327

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jni直接转byte_JNI开发之方法签名与Java通信(二)

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将通过以下两部分内容来介绍JNI开发:Android NDK开发 JNI类型签名和方法签名JNI实现java与c/c++相互通讯一、Android NDK开发 JNI类型签名和方法签名在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 。在J...

weixin_39646018的博客 438

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JNI 原理与静态、动态注册

除了性能的之外,最主要的原因就是在Java诞生之前,就有很多程序和库都是由Native语言写的,因此,重复利用这些Native语言编写的库是十分必要的,况且Native语言编写的库具有更好的性能。其中JNIEnv指代的是当前java环境,可以利用JNIEnv可以操作java层代码;在JNI_OnLoad函数的结尾处,我们一定要有返回值,而且必须是JNI_VERSION_1_4或JNI_VERSION_1_6,也就是JNI的版本号,我们一定要返回正确的版本号,否则系统也是无法加载的。.........

因热爱而执着,因执着而成功。 582

java jni技术_JNI技术简介

JNI(Java Native Interface)提供一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术。NDK(Native Development Kit)Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具,NDK描述的是工具集。 能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:在...

weixin_42356284的博客 907

【JNI基础】JNI基础知识1

JNI基础,NDK学习

cdkd123的专栏 516

JNI开发之方法签名与Java通信(二)

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将通过以下两部分内容来介绍JNI开发: Android NDK开发 JNI类型签名和方法签名 JNI实现java与c/c++相互通讯 一、Android NDK开发 JNI类型签名和方法签名 在Java存在两种数据类型: 基本类型 和 ...

AndroidAlvin的博客 333

Adnroid ndk 中jni访问java方法、对象、成员变量

JNI文件夹下,C++源码extern "C" { JNIEXPORT void JNICALL Java_ndk_test_JNI_accessJavaMethod(JNIEnv *env,jobject obj) { jclass ClassJNI = env->FindClass("ndk/test/JNI"); jmethodID returnStringID = env->G

刘胡来 1191

Android jni 编程4(对基本类型二维整型数组的操作)

Android jni 编程 对于整型二维数组操作:   类型一:传入二维整型数组,返回一个整型值   类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int SumArray2D(int [][]ar2d);//传一个二维数组,返回一个长度 private native int [][] ModifyArray2d(int...

weixin_30788619的博客 175

java show tables 返回_JNI开发之方法签名与Java通信(二)

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将通过以下两部分内容来介绍JNI开发:Android NDK开发 JNI类型签名和方法签名JNI实现java与c/c++相互通讯一、Android NDK开发 JNI类型签名和方法签名在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 。在J...

weixin_39643336的博客 189
上一篇: C++中基本数据类型字节数及取值范围
下一篇: Android AsyncTask完全解析,带你从源码的角度彻底理解
blueangle17
博客等级 码龄16年 78粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值