之前的一些文章都有涉及到上层和中间层的数据传输,简单来说,也就是参数和返回值的使用。因为中间层要做的最多的也就是数据传输与转换,下面来介绍下这方面的知识。数据传输可分为 基本数据类型传输 和 引用数据类型的传输 , 因为数组传输也比较特别(其实数组也是引用类型),所以这里也专门分出来讲讲。
相关推荐阅读:基于 Android NDK 的学习之旅目录 http://www.linuxidc.com/Linux/2011-08/40813.htm1、主要流程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(",");
- int len = strArray.length;
- nums = new int[len];
- for (int i = 0; i < len; i++) {
- try {
- nums[i] = Integer.valueOf(strArray[i]);
- System.out.println(nums[i]);
- } catch(NumberFormatException e) {
- etArrayNum.setText("");
- tvArrayDoubleNum.setText("");
- LogUtils.toastMessage(mContext, "输入有误,请重新输入数组");
- return false;
- }
- }
- return true;
- }
-
- private void setArrayNums() {
- int[] doubleArrayNums = getArrayDoubleNumber(nums);
-
- if(doubleArrayNums == null || doubleArrayNums.length <= 0) {
- LogUtils.toastMessage(mContext, "未转化成功");
- return ;
- }
-
- String str = "";
- for (int i = 0; i < doubleArrayNums.length; i++) {
- str += doubleArrayNums[i] +".";
- }
- str = str.substring(0,str.length()-1);
- tvArrayDoubleNum.setText(str);
- }
-
- class MyOnClickListener implements OnClickListener{
-
- @Override
- public void onClick(View v) {
- switch(v.getId()) {
- case R.id.btn_calculate:
- calculate();
- break;
- case R.id.btn_calculate_array:
- calculateArray();
- break;
- }
- }
- }
-
- /**
- * 计算2倍的数字
- *
- * @param num
- *
- * @return
- */
- public native int getDoubleNumber(int num);
-
-
- /**
- * 计算2倍的数组值
- *
- * @param num
- *
- * @return
- */
- public native int[] getArrayDoubleNumber(int[] nums);
-
- /**
- * 载入JNI生成的so库文件
- */
- static {
- System.loadLibrary(libSoName);
- }
- }