参考链接: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. Huawei-R&S-网络工程师实验笔记20190608-VLAN划分基础(基于端口、MAC地址、子网地址、协议)

    >Huawei-R&S-网络工程师实验笔记20190608-VLAN划分基础(基于端口.MAC地址.子网地址.协议) >>实验开始,先上拓扑图参考: 一.基于端口划分VLAN ...

  2. Maven学习总结(3)——使用Maven构建项目

    Maven学习总结(三)--使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Jave项目 1.1.创建J ...

  3. 火柴棒等式(2008年NOIP全国联赛提高组)

    题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: ...

  4. P1464 Function 洛谷

    https://www.luogu.org/problem/show?pid=1464 题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回 ...

  5. 源代码:windows文件切割与合并

    #include <Windows.h> #include <vector> #include <string> using namespace std; //推断 ...

  6. PHP array_intersect_ukey()

    定义和用法 array_intersect_ukey() 函数用回调函数比较键名来计算数组的交集. array_intersect_ukey() 返回一个数组,该数组包含了所有出现在 array1 中 ...

  7. 在imageView依次加入7个手势, 1.点击哪个button,往imageView上加入哪个手势.(保证视图上仅仅有一个手势). 2.轻拍:点击视图切换美女图片.(imageView上首先展示的美女

    // // ControlView.h // HomeworkGestureRecognizer // // Created by lanouhn on 14-8-27. // Copyright ( ...

  8. Android给定坐标计算距离

    给定两点的经纬度.计算两点之间的距离.这里要注意经纬度一定要依照顺序填写 1. 利用android中的工具获得,单位是米 float[] results=new float[1]; Location. ...

  9. 使用Fiddler进行抓包

    参考:http://blog.csdn.net/gld824125233/article/details/52588275 1.手机跟电脑需要使用同一个局域网  如果是台式机需要将手机的mac地址让运 ...

  10. BNU 13289 Energetic Pandas DP

     Energetic Pandas  There are n bamboos of different weights Wi. There are n pandas of different capa ...