基于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、 界面设计如下:
老老样子,很搓,嘿嘿
代码不在这贴出了,有需要的兄弟直接到文章结束部分下载。
2、 关键代码说明
Java 上层:
public native int getDoubleNumber(int num);
public native int[] getArrayDoubleNumber(int[] nums);
MainActivity.java
package com.duicky;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
/**
* 数据传输
*
* @author luxiaofeng <454162034@qq.com>
*
*/
public class MainActivity extends Activity {
//也就是你mk配置文件中的 LOCAL_MODULE := NDK_06
private static final String libSoName = "NDK_06";
private Context mContext = null;
private int num = 0;
private int[] nums;
private Button btnCalculate = null;
private Button btnCalculateArray = null;
private EditText etNum = null;
private EditText etArrayNum = null;
private TextView tvDoubleNum = null;
private TextView tvArrayDoubleNum = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mContext = this;
initViews();
}
/**
* 初始化控件
*/
private void initViews() {
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(new MyOnClickListener());
btnCalculateArray.setOnClickListener(new MyOnClickListener());
}
private void calculateArray() {
if(getArrayNums()) {
setArrayNums();
}
}
private void calculate() {
if(getNum()){
setNum();
}
}
private boolean getNum(){
try{
num = Integer.valueOf(etNum.getText().toString());
} catch(NumberFormatException e) {
etNum.setText("");
tvDoubleNum.setText("");
LogUtils.toastMessage(mContext, "输入有误,请重新输入数字");
return false;
}
return true;
}
private void setNum() {
int doubleNum = getDoubleNumber(num);
LogUtils.printWithLogCat("JNIMsg", "C JNI -- > Java: num = "+doubleNum);
tvDoubleNum.setText(String.valueOf(doubleNum));
}
private boolean getArrayNums() {
String str = etArrayNum.getText().toString();
if(str.length() <= 0) {
etArrayNum.setText("");
tvArrayDoubleNum.setText("");
LogUtils.toastMessage(mContext, "请按照格式输入");
return false;
}
System.out.println(str);
if(str.endsWith(".")){
str = str.substring(0, str.length()-2);
}
System.out.println(str);
String[] strArray = str.split(",");
&nb
补充:移动开发 , Android ,