Android JNI 把Java数组传递给C
来源:互联网 发布:网络交换机千兆百兆 编辑:程序博客网 时间:2024/05/17 22:11
项目简介:
该项目为从Java代码中把数组传递给C语言
详细介绍:
用户点击按钮后,java代码会把一个整形数组传递个C语言,经过C语言处理后,在Java代码中输出数组的值。如下图所示,数组的初始值是{1,2,3,4,5},点击按钮后,调用本地方法,将数组中的值全部加一,并吐司弹出:
该应用涉及到的知识有:
- 1.Java中和C中数组的转换
java中所有的数组都可以说是对象,而在C中不存在对象这一说法,所有的数组都是用指针去表示的。
把Java中数组转换为C中数组步骤:
1)确定数组长度(这一步并非必要,但是为了后续的操作数组,最好写上)
2)找到数组的首地址
注意:
- 1.无论在Java中还是C中,数组的传递实际上都是地址的传递。
- 2.项目部署时会首先把C文件编译成.so类库,部署后,手机上完全能够正常运行,但是项目中的C文件可能会报错。这里什么都不用管,直接把错误删除,或者把C文件直接删了。因为本地方法调用的是.so类库,部署后C文件就什么用都没有了。而且,部署后手机中的app能够正常运行,说明项目已经完成了。
步骤:
1.创建Android项目
准备工作。首先Add Native Support,让Android NDK自动生成jni文件夹和libs文件夹。然后把jni文件夹中的cpp文件后缀名更改为C,更改Android.mk文件。详情参考文章 Android JNI 调用C语言
2.布局文件
编写activity_main.xml文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="hhh.exercise.ujni_c.MainActivity" > <Button android:onClick="click" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点一点" /></RelativeLayout>
2.Activity
编写MainActivity.java文件:
import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity { static{ System.loadLibrary("Encode"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View v) { int[] arr = { 1, 2, 3, 4, 5 }; // 传入的是数组的首地址,即指针,所以,该数据的值会在C语言中改变 arrayEncode(arr); StringBuilder sb = new StringBuilder(); for (int i : arr) { sb.append(i); } Toast.makeText(getApplicationContext(), sb.toString(), 0).show(); } public native void arrayEncode(int[] arr);}
3.C文件
#include <jni.h>JNIEXPORT void JNICALL Java_hhh_exercise_ujni_1c_MainActivity_arrayEncode (JNIEnv * env, jobject obj, jintArray jIntArr){ //首先要将Java的整形数组转化成C的整形数组。所以,要拿到该数组的长度和首地址,即可以完成对数组的操作 // 拿到数组的长度 // jsize (*GetArrayLength)(JNIEnv*, jarray); int size=(*env)->GetArrayLength(env,jIntArr); // 达到数组的首地址 // jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);第三个参数一律传入0 int* arrp=(*env)->GetIntArrayElements(env,jIntArr,0); int i; for(i=0;i<size;i++){ //将数组中的元素全部加1 *(arrp+i)+=1; }}
整个Demo完成
1 0
- Android JNI 把Java数组传递给C
- jni中c++给java传递数组
- jni数组使用及将C的char数组传递给Java
- JNI中C和java传递数组
- 把数组传递给函数
- JNI中java传递各类型参数给C
- jni传递数据给java
- JNI基础(五)java调C,并且传递数组
- JNI学习笔记 C++传递结构体、String、数组对象给JavaC++传递结构体、String、数组对象给Java
- JAVA->JNI 传递字符串数组
- Android JNI JByteArray传递byte数组到Java
- Android Java层与Jni层的数组传递
- Android JNI JByteArray传递byte数组到Java
- (转载) C语言技巧:怎样把数组作为参数传递给函数?(值传递和指针传递)
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- ubuntu 安装openjdk8
- 机器人TF库
- 变态的程序园网站
- C#从三通道图像数据流转到HObject
- MS word 2010大小写转换方法
- Android JNI 把Java数组传递给C
- jquery中获取一批包含同样字符id值方法
- 4.空格替换
- eclipse插件egit安装使用
- MySQL表结构优化、数据类型选择方法
- 采用jacob实现word转pdf
- sdut 2603 向量的旋转变换与旋转角的关系(山东第4届省赛)
- C# 判断字符串为Null或空的方法
- 写sql习惯:注意将查询结果排序