这一节只是在<4>节的基础上增加一个java到C数组数据传递用法,其他的通<4>,下面只给出新增加部分:
<1> : 新建一个jniarr.c源文件:
#include<jni.h> #include<string.h> jintArray Java_com_example_hellojnidemo4_MainActivity_oarray(JNIEnv * env,jobject obj,int arr[]) { // 1.获取到 arr的大小 int len = (*env)->GetArrayLength(env, arr); if (len == 0) { return arr; } //取出数组中第一个元素的内存地址 jint* p = (*env)->GetIntArrayElements(env, arr, 0); int i = 0; for (; i < len; i++) { *(p + i) += 5; //取出的每个元素加五 } return arr; }
上面代码中操作部分是借鉴网上的,只是要注意数组是如何操作,它的API.
Android.mk文件修改后如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jnilibs LOCAL_SRC_FILES := jnia.c LOCAL_SRC_FILES := jnib.c LOCAL_SRC_FILES := jniarr.c include $(BUILD_SHARED_LIBRARY)
多增加一行即可.
<2> : android工程部分在增加一个按钮,新增加代码:
函数声明:
private native int[] oarray(int[] num);
调用:
mArrayBtn=(Button)findViewById(R.id.button5); mArrayBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub int len=numid.length; for(int i=0;i<len;i++){ Log.i("counter","number ID : "+numid[i]); } } });
<3> : 运行效果如下:
下一节继续在这个基础上增加Log信息的打印.