zoukankan      html  css  js  c++  java
  • 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
    ");
    
        // 获取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、

  • 相关阅读:
    c#泛型的使用
    如何调试由于heap corruption导致的程序崩溃的简单示例
    Windows的SEH机理简要介绍
    利用定制行为扩展WCF之利用MessageInsepctor behaviourExtension扩展WCF行为(自定义消息头)
    欧拉函数
    JZOJ.1349 最小公约数
    关于扩展中国剩余定理(excrt)的证明与拙见
    【USACO 2021 US Open, Gold】United Cows of Farmer John & JZOJ7220
    线性求逆元
    【USACO 2021 January Contest, Platinum】Problem 1. Sum of Distances JZOJ.7241
  • 原文地址:https://www.cnblogs.com/javaskill/p/5435628.html
Copyright © 2011-2022 走看看