数据传输linux代码,基于 Android NDK 的学习之旅-----数据传输一(基本数据类型和数组传输)(附源码)...

之前的一些文章都有涉及到上层和中间层的数据传输,简单来说,也就是参数和返回值的使用。因为中间层要做的最多的也就是数据传输与转换,下面来介绍下这方面的知识。

数据传输可分为 基本数据类型传输 和 引用数据类型的传输 , 因为数组传输也比较特别(其实数组也是引用类型),所以这里也专门分出来讲讲。

1、主要流程

1、 基本数据类型的传输

a)        上层定义一个native的方法,需要一个int 参数 ,返回一个int值

b)       JNI 对应 上层的方法 , 打印出  上层 传输下来的 int数据,并返回 int数据

c)        上层 收到 native 方法 返回的 值,在UI中显示出来

2、 数组的传输

a)        上层定义一个native的方法,需要一个int数组,返回一个int数组

b)       JNI 对应上层的方法,取出上层传递数组中的数据处理和打印出来,并存入新数组中,最后把该数组返回给 Java层

c)        上层 收到 native返回的 数组,加工成字符串,在UI中显示出来

2设计实现

1、 界面设计如下:

181a7fd9090bedd1d6bc32a75bfd692c.gif

老老样子,很搓,嘿嘿

代码不在这贴出了,有需要的兄弟直接到文章结束部分下载。

2、 关键代码说明

Java 上层:

publicnativeintgetDoubleNumber(intnum);

publicnativeint[] getArrayDoubleNumber(int[] nums);

MainActivity.java

packagecom.duicky;

importandroid.app.Activity;

importandroid.content.Context;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.TextView;

/**

* 数据传输

*

* @author luxiaofeng <454162034@qq.com>

*

*/

publicclassMainActivityextendsActivity {

//也就是你mk配置文件中的  LOCAL_MODULE    := NDK_06

privatestaticfinalString libSoName ="NDK_06";

privateContext mContext =null;

privateintnum =0;

privateint[] nums;

privateButton btnCalculate =null;

privateButton btnCalculateArray =null;

privateEditText etNum =null;

privateEditText etArrayNum =null;

privateTextView tvDoubleNum =null;

privateTextView tvArrayDoubleNum =null;

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mContext =this;

initViews();

}

/**

* 初始化控件

*/

privatevoidinitViews() {

btnCalculate = (Button) findViewById(R.id.btn_calculate);

btnCalculateArray = (Button) findViewById(R.id.btn_calculate_array);

etNum = (EditText) findViewById(R.id.et_num);

etArrayNum = (EditText) findViewById(R.id.et_array_num);

tvDoubleNum = (TextView) findViewById(R.id.tv_double_num);

tvArrayDoubleNum = (TextView) findViewById(R.id.tv_array_double_num);

btnCalculate.setOnClickListener(newMyOnClickListener());

btnCalculateArray.setOnClickListener(newMyOnClickListener());

}

privatevoidcalculateArray() {

if(getArrayNums()) {

setArrayNums();

}

}

privatevoidcalculate() {

if(getNum()){

setNum();

}

}

privatebooleangetNum(){

try{

num = Integer.valueOf(etNum.getText().toString());

}catch(NumberFormatException e) {

etNum.setText("");

tvDoubleNum.setText("");

LogUtils.toastMessage(mContext,"输入有误,请重新输入数字");

returnfalse;

}

returntrue;

}

privatevoidsetNum() {

intdoubleNum = getDoubleNumber(num);

LogUtils.printWithLogCat("JNIMsg","C JNI -- >  Java: num = "+doubleNum);

tvDoubleNum.setText(String.valueOf(doubleNum));

}

privatebooleangetArrayNums() {

String str = etArrayNum.getText().toString();

if(str.length() <=0) {

etArrayNum.setText("");

tvArrayDoubleNum.setText("");

LogUtils.toastMessage(mContext,"请按照格式输入");

returnfalse;

}

System.out.println(str);

if(str.endsWith(".")){

str = str.substring(0, str.length()-2);

}

System.out.println(str);

String[] strArray = str.split(",");

intlen = strArray.length;

nums =newint[len];

for(inti =0; i 

try{

nums[i] = Integer.valueOf(strArray[i]);

System.out.println(nums[i]);

}catch(NumberFormatException e) {

etArrayNum.setText("");

tvArrayDoubleNum.setText("");

LogUtils.toastMessage(mContext,"输入有误,请重新输入数组");

returnfalse;

}

}

returntrue;

}

privatevoidsetArrayNums() {

int[] doubleArrayNums = getArrayDoubleNumber(nums);

if(doubleArrayNums ==null|| doubleArrayNums.length <=0) {

LogUtils.toastMessage(mContext,"未转化成功");

return;

}

String str ="";

for(inti =0; i 

str += doubleArrayNums[i] +".";

}

str = str.substring(0,str.length()-1);

tvArrayDoubleNum.setText(str);

}

classMyOnClickListenerimplementsOnClickListener{

@Override

publicvoidonClick(View v) {

switch(v.getId()) {

caseR.id.btn_calculate:

calculate();

break;

caseR.id.btn_calculate_array:

calculateArray();

break;

}

}

}

/**

* 计算2倍的数字

*

* @param num

*

* @return

*/

publicnativeintgetDoubleNumber(intnum);

/**

* 计算2倍的数组值

*

* @param num

*

* @return

*/

publicnativeint[] getArrayDoubleNumber(int[] nums);

/**

* 载入JNI生成的so库文件

*/

static{

System.loadLibrary(libSoName);

}

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值