Welcome 微信登录

首页 / 操作系统 / Linux / 基于 Android NDK 的学习之旅-----数据传输一(基本数据类型和数组传输)(附源码)

之前的一些文章都有涉及到上层和中间层的数据传输,简单来说,也就是参数和返回值的使用。因为中间层要做的最多的也就是数据传输与转换,下面来介绍下这方面的知识。数据传输可分为 基本数据类型传输 和 引用数据类型的传输 , 因为数组传输也比较特别(其实数组也是引用类型),所以这里也专门分出来讲讲。相关推荐阅读基于 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 上层:
  1. public native int getDoubleNumber(int num);    
  2. public native int[] getArrayDoubleNumber(int[] nums);  
MainActivity.java
  1. package com.duicky;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.TextView;  
  11. /** 
  12.  * 数据传输 
  13.  *  
  14.  * @author luxiaofeng <454162034@qq.com> 
  15.  * 
  16.  */  
  17. public class MainActivity extends Activity {  
  18.       
  19.     //也就是你mk配置文件中的  LOCAL_MODULE    := NDK_06   
  20.     private static final String libSoName = "NDK_06";  
  21.     private Context mContext = null;  
  22.       
  23.     private int num = 0;  
  24.     private int[] nums;  
  25.       
  26.     private Button btnCalculate = null;  
  27.     private Button btnCalculateArray = null;  
  28.     private EditText etNum = null;  
  29.     private EditText etArrayNum = null;  
  30.     private TextView tvDoubleNum = null;  
  31.     private TextView tvArrayDoubleNum = null;  
  32.       
  33.       
  34.     /** Called when the activity is first created. */  
  35.     @Override  
  36.     public void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.main);  
  39.         mContext = this;  
  40.         initViews();  
  41.     }  
  42.       
  43.     /** 
  44.      * 初始化控件 
  45.      */  
  46.     private void initViews() {  
  47.         btnCalculate = (Button) findViewById(R.id.btn_calculate);  
  48.         btnCalculateArray = (Button) findViewById(R.id.btn_calculate_array);  
  49.         etNum = (EditText) findViewById(R.id.et_num);  
  50.         etArrayNum = (EditText) findViewById(R.id.et_array_num);  
  51.         tvDoubleNum = (TextView) findViewById(R.id.tv_double_num);  
  52.         tvArrayDoubleNum = (TextView) findViewById(R.id.tv_array_double_num);  
  53.         btnCalculate.setOnClickListener(new MyOnClickListener());  
  54.         btnCalculateArray.setOnClickListener(new MyOnClickListener());  
  55.     }  
  56.   
  57.     private void calculateArray() {  
  58.         if(getArrayNums()) {  
  59.             setArrayNums();  
  60.         }  
  61.     }  
  62.   
  63.     private void calculate() {  
  64.         if(getNum()){  
  65.             setNum();  
  66.         }  
  67.     }  
  68.       
  69.     private boolean getNum(){  
  70.         try{  
  71.             num = Integer.valueOf(etNum.getText().toString());  
  72.         } catch(NumberFormatException e) {  
  73.             etNum.setText("");  
  74.             tvDoubleNum.setText("");  
  75.             LogUtils.toastMessage(mContext, "输入有误,请重新输入数字");  
  76.             return false;  
  77.         }  
  78.         return true;  
  79.     }  
  80.       
  81.     private void setNum() {  
  82.         int doubleNum = getDoubleNumber(num);  
  83.         LogUtils.printWithLogCat("JNIMsg""C JNI -- >  Java: num = "+doubleNum);  
  84.         tvDoubleNum.setText(String.valueOf(doubleNum));  
  85.     }  
  86.       
  87.     private boolean getArrayNums() {  
  88.         String str = etArrayNum.getText().toString();  
  89.         if(str.length() <= 0) {  
  90.             etArrayNum.setText("");  
  91.             tvArrayDoubleNum.setText("");  
  92.             LogUtils.toastMessage(mContext, "请按照格式输入");  
  93.             return false;  
  94.         }  
  95.         System.out.println(str);  
  96.         if(str.endsWith(".")){  
  97.             str = str.substring(0, str.length()-2);  
  98.         }  
  99.         System.out.println(str);  
  100.         String[] strArray = str.split(",");  
  101.         int len = strArray.length;  
  102.         nums = new int[len];  
  103.         for (int i = 0; i < len; i++) {  
  104.             try {  
  105.                 nums[i] = Integer.valueOf(strArray[i]);  
  106.                 System.out.println(nums[i]);  
  107.             } catch(NumberFormatException e) {  
  108.                 etArrayNum.setText("");  
  109.                 tvArrayDoubleNum.setText("");  
  110.                 LogUtils.toastMessage(mContext, "输入有误,请重新输入数组");  
  111.                 return false;  
  112.             }  
  113.         }  
  114.         return true;  
  115.     }  
  116.       
  117.     private void setArrayNums() {  
  118.         int[] doubleArrayNums = getArrayDoubleNumber(nums);  
  119.           
  120.         if(doubleArrayNums == null || doubleArrayNums.length <= 0) {  
  121.             LogUtils.toastMessage(mContext, "未转化成功");  
  122.             return ;  
  123.         }  
  124.           
  125.         String str = "";  
  126.         for (int i = 0; i < doubleArrayNums.length; i++) {  
  127.             str += doubleArrayNums[i] +".";  
  128.         }  
  129.         str = str.substring(0,str.length()-1);  
  130.         tvArrayDoubleNum.setText(str);  
  131.     }  
  132.       
  133.    class MyOnClickListener implements OnClickListener{  
  134.   
  135.         @Override  
  136.         public void onClick(View v) {  
  137.             switch(v.getId()) {  
  138.                 case R.id.btn_calculate:  
  139.                     calculate();  
  140.                     break;  
  141.                 case R.id.btn_calculate_array:  
  142.                     calculateArray();  
  143.                     break;  
  144.             }  
  145.         }  
  146.     }  
  147.   
  148.     /** 
  149.      * 计算2倍的数字 
  150.      *  
  151.      * @param num 
  152.      *  
  153.      * @return 
  154.      */  
  155.     public native int getDoubleNumber(int num);  
  156.       
  157.       
  158.     /** 
  159.      * 计算2倍的数组值 
  160.      *  
  161.      * @param num 
  162.      *  
  163.      * @return 
  164.      */  
  165.     public native int[] getArrayDoubleNumber(int[] nums);  
  166.       
  167.     /** 
  168.      * 载入JNI生成的so库文件 
  169.      */  
  170.     static {  
  171.         System.loadLibrary(libSoName);  
  172.     }  
  173. }