先看java层的编写
public class JniDemo {
int[] arrays = {
4, 3, 12, 45, 12, 12, 14, 15, 17, 18};
Father[] objArray = {
new Father(), new Father(), new Father()};
// 操作数组
public native void processArray();
}
Father类
import android.util.Log;
public class Father {
public void function(){
Log.i("dhy", "Native call");
}
}
再来看native层的操作
// 定义一下log,方便调试
#define TAG "dhy33333333"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
// 操作数组
extern "C"
JNIEXPORT void JNICALL
Java_com_univer_androidyellowbook_JniDemo_processArray(JNIEnv *env, jobject thiz) {
// 1.首先获取数组的field_id
jfieldID fid_arrays = env -> GetFieldID(env->GetObjectClass(thiz), "arrays", "[I");
// 2.获取java中数组对象
jintArray jint_arr = (jintArray) env -> GetObjectField(thiz, fid_arrays);
// 3.根据对象获取指针
jint* int_arr = env->GetIntArrayElements(jint_arr, NULL);
LOGE("1111")
// 4.获取数组长度
jsize len = env->GetArrayLength(jint_arr);
// 新建一个jintarray对象
jintArray jint_array_temp = env->NewIntArray(len);
// 获取jint_array_temp对象的指针
jint* int_array_temp = env->GetIntArrayElements(jint_array_temp, NULL);
LOGE("2222")
// 计数
jint count = 0;
// 将偶数位存入int_arr_temp中
for (jsize j=0;j<len; j++){
if(j%2==0){
int_array_temp[count++] = int_arr[j];
}
}
// 打印int_arr_temp内存中的数组
for(jsize k=0; k<count; k++){
cout<<int_array_temp[k] << ",";
}
cout<<endl;
// 将数组中的一段3-7设置为一定的值,并且打印出来
jint* buffer = new jint[4];
for (int n=0; n<4; n++){
buffer[n] = n + 1;
}
// 将buffer这个数组中设置到数组从3开头长度为4的值中
env->SetIntArrayRegion(jint_arr, 3, 4, buffer);
LOGE("3333")
cout<<"重新获取的数组中3-7的值变成了:";
for (int m=0; m< len; m++){
cout<<int_arr[m]<<",";
}
cout<<endl;
LOGE("4444")
// c++的排序
std::sort(int_arr, int_arr+len);
// env->SetObjectField(thiz, fid_arrays, jint_arr);
// 释放数组指针
env->ReleaseIntArrayElements(jint_arr, int_arr, JNI_ABORT);
LOGE("55555")
// 操作对象数组
jfieldID fid_obj_array = env->GetFieldID(env->GetObjectClass(thiz), "objArray", "[Lcom/univer/androidyellowbook/Father;");
// 获取对象
jobjectArray job_array = (jobjectArray)env->GetObjectField(thiz, fid_obj_array);
// 从对象中获取索引值为1的对象Father
jobject jobj = env->GetObjectArrayElement(job_array, 1);
// 获取father对象的Class对象
jclass clazz_father = env->GetObjectClass(jobj);
// 获取father对象的method_id;
jmethodID fid_func = env->GetMethodID(clazz_father, "function", "()V");
// 调用function方法
env->CallVoidMethod(jobj, fid_func);
// 在本地创建一个大小为10的对象数组,对象的初始化都是jobj
jobjectArray job_arr_temp = env->NewObjectArray(10, env->GetObjectClass(jobj), jobj);
// 获取本地对象数组的第4个对象
jobject jobj_temp = env->GetObjectArrayElement(job_arr_temp, 3);
// 调用对象中的function方法
env->CallVoidMethod(jobj_temp, fid_func);
}
注意
如果这个native方法是static的话,那么传入native层的就是jclass
如果是public那就是jobject
引入一个so可以在多个类里写入native方法