Android使用NDK---函数参数传递-基本类型和数组
参考链接: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---函数参数传递-基本类型和数组的更多相关文章
- js中函数参数基本类型和引用类型的区别
高级程序设计中说明,所有函数的参数都是按值传递的. 基本类型 向参数传递基本类型的值时,被传递的值会被复制给对应的命名参数 function addTen(num){ num=+10; return ...
- Android Studio NDK 学习之接受Java传入的Int数组
本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫AndroidJ ...
- VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
VB几种函数参数传递方法,Variant,数组,Optional,ParamArray 一) 过程的参数被缺省为具有 Variant 数据类型. 1)ByRef按 地址传递参数在 VB 中是缺省的 按 ...
- C语言学习笔记 (005) - 二维数组作为函数参数传递剖析
前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...
- 《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。
在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子. 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址. #include <std ...
- Android JNI&NDK编程小结及建议
前言 由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签 ...
- javascript变量中基本类型和引用类型的详解解读
前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...
- 基本类型和引用类型的值 [重温JavaScript基础(一)]
前言: JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类 ...
- Android Studio NDK 学习之接受Java传入的字符串
本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫Prompt,其 ...
随机推荐
- [BZOJ 4999]This Problem Is Too Simple!
[BZOJ 4999]This Problem Is Too Simple! 题目 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将 ...
- hdu_1012_u Calculate e_201310121519
u Calculate eTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- [bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树
二叉树 Tree Rotations bzoj-3702 bzoj-2212 Poi-2011 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节点,满足 ...
- 洛谷 P1586 四方定理
P1586 四方定理 题目描述 四方定理是众所周知的:任意一个正整数nn,可以分解为不超过四个整数的平方和.例如:25=1^{2}+2^{2}+2^{2}+4^{2}25=12+22+2 ...
- mongodb之备份
前言 数据库的备份非常重要 备份方式 使用Mongodb自带的运维管理工具(Ops Manager) 需要单独部署,比较麻烦和复杂 通过文件系统快照 Linux需要LVM支持需要开启journal日志 ...
- mysql 源码 王恒 [mysql数据结构+mysql 执行计划]
http://blog.chinaunix.net/uid/26896862/cid-156733-list-1.html http://www.it168.com/redian/wangheng/
- HTML5:控件自动获得焦点
在HTML5中,页面打开后,需要指定的控件自动获得焦点很简单,只需要一个属性就可以实现 - autofocus. 示例如下: <input type="text" auto ...
- Ubuntu14.04下Android系统与应用开发软件完整apt-get 源。
# deb cdrom:[Ubuntu 14.04.1 LTS _Trusty Tahr_ - Release amd64 (20140722.2)]/ trusty main restricted# ...
- 鸟哥的Linux私房菜-----8、文件系统的装载
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Spring+Mybatis之登录功能demo
其实工作之后就没有用过Spring+Mybatis的框架了,因为公司有一个自己开发的框架,讲道理,其实这个与Spring+Mybatis整合很是神似.当然性能上还是比不上Spring+Mybatis所 ...