JNIjw05

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\n");

    // 获取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("\n");

// ***
    
    // 新建一个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("\n");

// ***

    // 将数组中一段(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("\n");

// ***

    // 将数组中的一段(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("\n");

// ***
    
    // 调用C++标准库中的排序放大sort(...),传递一个数组的开始指针和结束指针
    std::sort(int_arr, int_arr + len);
    // 迭代打印数组中的元素
    printf("数组排序后的结果 : ");
    for (jsize s=0; s<3; s++)
    {
        printf("%d , ", int_arr[s]);
    }
    printf("\n");
    // 释放数组指针
    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\n");
}

 

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、

 

posted @ 2016-04-26 16:35  JavaSkill  阅读(230)  评论(0编辑  收藏  举报