参考链接:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/19/2145486.html

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

一、主要流程

1、 基本数据类型的传输

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

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

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

2、 数组的传输

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

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

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

二、使用代码

java文件:

        public native String careJuly();
public native int careJulyIn(int showCode);
public native int[] careJulyArray(int[] InCode); static {
System.loadLibrary("feelJulyGpsMap");
}

cpp文件:

#include <jni.h>
#include <string.h>
#include <android/log.h> JNIEnv* jniEnv; extern "C" jstring Java_com_example_feeljulygpsmap_FeelJulyActivity_careJuly(JNIEnv *env, jobject thiz) { return env->NewStringUTF( "Hello, July!" );
} extern "C" jint Java_com_example_feeljulygpsmap_FeelJulyActivity_careJulyIn(JNIEnv *env, jobject thiz,jint showCode) {
//return env->NewStringUTF( "Hello, July!" ); if(jniEnv == NULL) {
jniEnv = env;
} //获取 Java 传递下来 数字
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : num = %d",showCode);
//返回 2 倍 的数字给 Java
return showCode*2;
} extern "C" jintArray Java_com_example_feeljulygpsmap_FeelJulyActivity_careJulyArray(JNIEnv *env, jobject thiz,jintArray InCode) {
//return env->NewStringUTF( "Hello, July!" ); if(jniEnv == NULL) {
jniEnv = env;
} if(InCode == NULL){
return NULL;
} //获取 Java 传递下来 数组 的 长度
//jsize len = (*jniEnv)->GetArrayLength(jniEnv, InCode);
jsize len = jniEnv->GetArrayLength( InCode); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : len = %d",len); if(len <= 0) {
return NULL;
} //新建一个长度为len的jintArray数组
//jintArray array = (*jniEnv)-> NewIntArray(jniEnv, len);
jintArray array = env->NewIntArray(len); if(array == NULL) {
return NULL;
} // 把 Java 传递下来的数组 用 jint* 存起来
//jint *body = (*env)->GetIntArrayElements(env,InCode, 0);
jint *body = env->GetIntArrayElements(InCode, 0); jint i = 0;
jint num[len];
for (; i < len; i++) {
num[i] = body[i] * 2;
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : nums[%d] = %d",i,num[i]);
} if(num == NULL){
return NULL;
} //给 需要返回的数组赋值
//(*jniEnv)->SetIntArrayRegion(jniEnv,array, 0, len, num);
jniEnv->SetIntArrayRegion(array, 0, len, num); return array;
}

错误提示:undefined reference to `__android_log_print'

修改MK文件,添加:

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

LOCAL_MODULE    := feelJulyGpsMap
LOCAL_SRC_FILES := feelJulyGpsMap.cpp include $(BUILD_SHARED_LIBRARY)

三、UI设计代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <SurfaceView
android:id="@+id/camera_preview"
android:layout_width="240dp"
android:layout_height="160dp" /> <Button
android:id="@+id/save_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fly" /> <Button
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="计算"
android:id="@+id/btn_calculate" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="生成"
android:id="@+id/btn_calculate_array" />
<EditText
android:layout_width="60dp"
android:layout_height="wrap_content"
android:id="@+id/et_num" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/et_array_num" />
<TextView
android:layout_width="60dp"
android:layout_height="wrap_content"
android:id="@+id/tv_double_num"
android:text="CalNum:" />
<TextView
android:id="@+id/tv_array_double_num"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="CalArray:" /> </LinearLayout>

四、运行结果

            

Android使用NDK---函数参数传递-基本类型和数组的更多相关文章

  1. js中函数参数基本类型和引用类型的区别

    高级程序设计中说明,所有函数的参数都是按值传递的. 基本类型 向参数传递基本类型的值时,被传递的值会被复制给对应的命名参数 function addTen(num){ num=+10; return ...

  2. Android Studio NDK 学习之接受Java传入的Int数组

    本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫AndroidJ ...

  3. VB几种函数参数传递方法,Variant,数组,Optional,ParamArray

    VB几种函数参数传递方法,Variant,数组,Optional,ParamArray 一) 过程的参数被缺省为具有 Variant 数据类型. 1)ByRef按 地址传递参数在 VB 中是缺省的 按 ...

  4. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析

    前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...

  5. 《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。

        在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子. 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址. #include <std ...

  6. Android JNI&NDK编程小结及建议

    前言 由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签 ...

  7. javascript变量中基本类型和引用类型的详解解读

    前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...

  8. 基本类型和引用类型的值 [重温JavaScript基础(一)]

    前言: JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类 ...

  9. Android Studio NDK 学习之接受Java传入的字符串

    本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫Prompt,其 ...

随机推荐

  1. 《ABCD组》第八次作业:ALPHA冲刺

    <ABCD组>第八次作业:ALPHA冲刺 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...

  2. webstorm+nodejs环境中安装淘宝镜像

    用过nodejs的人都知道,从node的官方模板库下载依赖包的时候,经常会遇到“假死”(页面静止不动)的状态,这种速度简直要逼死焦急地等待下班的人.还好咱们万能的淘宝提供了淘宝镜像这么一个不要更好用的 ...

  3. python基础综合题----选自python二级考试

    <笑傲江湖>是金庸的重要武侠作品之一.这里给出一个<笑傲江湖>的网络版本, 文件名为“笑傲江湖-网络版.txt”.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭ ...

  4. JavaScript学习总结(7)——JavaScript基础知识汇总

  5. 清北学堂模拟赛d7t5 做实验

    题目描述有一天,你实验室的老板给你布置的这样一个实验.首先他拿出了两个长度为 n 的数列 a 和 b,其中每个 ai 以二进制表示一个集合.例如数字 5 = (101)2 表示集合 f1; 3g.第 ...

  6. c语言char 和int的问题

    参考:http://www.cnblogs.com/dire/p/5222968.html 参考baidu: char和int的定义我是清楚的,现在有一个问题: 1.设A和B是int型,C是char型 ...

  7. SAP 金税接口增强 BADI

      SAP与金税连接有两种方式:组件接口及文本接口. 文本接口为例: 1.SAP取发票数据.主要来自合同,销售订单,交货单.发票,客户供应商主数据等 2.SAP处理:合并.拆分,折扣等 3.导出TXT ...

  8. poj 1664 放苹果 (划分数)

    题意:中文题目,不解释... 题解: 第一种方法是暴力深搜:枚举盘子1~n放苹果数量的所有情况,不需要剪枝:将每次枚举的情况,即每个盘的苹果数量,以字典序排序,然后存进set里 以此去重像" ...

  9. java 工厂方法模式简单实例

    工厂方法模式:也叫工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象. 目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究 ...

  10. oc60--Category 分类 练习

    // main.m // Category练习 #import <Foundation/Foundation.h> #import "NSString+NJ.h" // ...