ZC: 这个代码,没有真正的运行测试
1、VC6(CPP)的DLL代码:
#include<stdio.h> #include "jniZ_JNIjw05.h" #include <string> #include <algorithm> using namespace std; JNIEXPORT void JNICALL Java_jniZ_JNIjw05_CallCppFunction (JNIEnv * env, jobject obj) { printf("Java_jniZ_JNIjw05_CallCppFunction - 1 "); // 获取obj中对象的class对象 jclass clazz = env->GetObjectClass(obj); // 获取java中的属性arrays的id jfieldID fid_arrays = env->GetFieldID(clazz, "arrays", "[I"); // 获取java中的属性arrays的对象 jintArray jint_arr = (jintArray)env->GetObjectField(obj, fid_arrays); // 获取arrays对象的指针 jint* int_arr = env->GetIntArrayElements(jint_arr, NULL); // 获取数组的长度 jsize len = env->GetArrayLength(jint_arr); // 打印数组中的值 printf("数组的值为 : "); for (int i=0; i<len; i++) // ZC: 注意到,这里使用的是 int而非jint... { printf("%d , ", int_arr[i]); } printf(" "); // *** // 新建一个jintArray对象 jintArray jint_arr_temp = env->NewIntArray(len); // 获取 jint_arr_temp对象的指针 jint* int_arr_temp = env->GetIntArrayElements(jint_arr_temp, NULL); // 计数 jint count = 0; // 偶数位 存入到int_arr_temp内存中 for (jsize j=0; j<len; j++) { if ((j % 2) == 0) { int_arr_temp[count++] = int_arr[j]; } } // 打印int_arr_temp内存中的数组 printf("数组中位置是偶数的值为 : "); for (jsize k=0; k<count; k++) { printf("%d , ", int_arr_temp[k]); } printf(" "); // *** // 将数组中一段(0-2)数据拷贝到内存中,并打印出来 jint* buffer = new jint[len]; // 获取数组中从0开始长度为3的一段数据值 env->GetIntArrayRegion(jint_arr, 0, 3, buffer); printf("打印数组中0-3 一段值 : "); for (int l=0; l<3; l++) { printf("%d , ", buffer[l]); } printf(" "); // *** // 将数组中的一段(3-7)设置成一定的值,并打印出来 jint *buffers = new jint[4]; for (int n=0; n<4; n++) { buffers[n] = n + 1; } // 将buffers这个数组中值 设置到数组从3开始长度是4的值中 env->SetIntArrayRegion(jint_arr, 3, 4, buffers); // 重新获取数组指针 int_arr = env->GetIntArrayElements(jint_arr, NULL); printf("数组中3-7 这段值变成了 : "); for (int m=0; m<3; m++) { printf("%d , ", int_arr[m]); } printf(" "); // *** // 调用C++标准库中的排序放大sort(...),传递一个数组的开始指针和结束指针 std::sort(int_arr, int_arr + len); // 迭代打印数组中的元素 printf("数组排序后的结果 : "); for (jsize s=0; s<3; s++) { printf("%d , ", int_arr[s]); } printf(" "); // 释放数组指针 env->ReleaseIntArrayElements(jint_arr, int_arr, JNI_ABORT); // *** //获取Java中对象Father数组属性的id jfieldID fid_obj_arrays = env->GetFieldID(env->GetObjectClass(obj),"objArrays","[Lcom/jni/demo/Father;"); //获取Java中对象数组Father属性objArrays的对象 jobjectArray jobj_arr = (jobjectArray)env->GetObjectField(obj,fid_obj_arrays); //从对象数组中获取索引值为1的对象Father jobject jobj = env->GetObjectArrayElement(jobj_arr,1); //获取Father对象的class对象 jclass clazz_father = env->GetObjectClass(jobj); //获取Father对象中的function方法的id jmethodID id_father_function = env->GetMethodID(clazz_father,"function","()V"); //调用Father对象中的function方法 env->CallVoidMethod(jobj,id_father_function); //在本地创建一个大小为10的对象数组,对象的初始化都是jobj,也就是方法的第三个参数 jobjectArray jobj_arr_temp = env->NewObjectArray(10,env->GetObjectClass(jobj),jobj); //获取本地对象数组中第4个对象 jobject jobj_temp = env->GetObjectArrayElement(jobj_arr_temp,3); //调用Father对象中的function方法 env->CallVoidMethod(jobj_temp,id_father_function); printf("Java_jniZ_JNIjw05_CallCppFunction - 2 "); }
2、Java代码:
package jniZ; public class JNIjw05 { //定义一个int型数组 int[] arrays = {4,3,12,56,1,23,45,67}; //定义Father对象数组 Father[] objArrays = {new Father(),new Father(),new Father()}; //定义一个本地方法 public native void CallCppFunction(); public static void main(String[] args)throws Exception { //调用动态链接库 System.loadLibrary("JNIjwVC6_05"); JNIjw05 jni05 = new JNIjw05(); jni05.CallCppFunction(); } } class Father {}
3、Java控制台输出:
4、
5、