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