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=; 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 = ;
// 偶数位 存入到int_arr_temp内存中
for (jsize j=; j<len; j++)
{
if ((j % ) == )
{
int_arr_temp[count++] = int_arr[j];
}
}
// 打印int_arr_temp内存中的数组
printf("数组中位置是偶数的值为 : ");
for (jsize k=; k<count; k++)
{
printf("%d , ", int_arr_temp[k]);
}
printf("\n"); // *** // 将数组中一段(0-2)数据拷贝到内存中,并打印出来
jint* buffer = new jint[len];
// 获取数组中从0开始长度为3的一段数据值
env->GetIntArrayRegion(jint_arr, , , buffer);
printf("打印数组中0-3 一段值 : ");
for (int l=; l<; l++)
{
printf("%d , ", buffer[l]);
}
printf("\n"); // *** // 将数组中的一段(3-7)设置成一定的值,并打印出来
jint *buffers = new jint[];
for (int n=; n<; n++)
{
buffers[n] = n + ;
}
// 将buffers这个数组中值 设置到数组从3开始长度是4的值中
env->SetIntArrayRegion(jint_arr, , , buffers);
// 重新获取数组指针
int_arr = env->GetIntArrayElements(jint_arr, NULL);
printf("数组中3-7 这段值变成了 : ");
for (int m=; m<; m++)
{
printf("%d , ", int_arr[m]);
}
printf("\n"); // *** // 调用C++标准库中的排序放大sort(...),传递一个数组的开始指针和结束指针
std::sort(int_arr, int_arr + len);
// 迭代打印数组中的元素
printf("数组排序后的结果 : ");
for (jsize s=; s<; 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,);
//获取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(,env->GetObjectClass(jobj),jobj);
//获取本地对象数组中第4个对象
jobject jobj_temp = env->GetObjectArrayElement(jobj_arr_temp,);
//调用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、

JNIjw05的更多相关文章

随机推荐

  1. C#操作AD及Exchange Server总结(二)

    上一节C#操作AD及Exchange Server总结(一)写了对AD的操作,新建AD用户后,通常都需要为此用户开启Exchange邮箱,接下来写如何远程操作Exchange. 三.对Exchange ...

  2. HDU 1879 继续畅通工程(Kruskra)

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. hibernate set的3个属性

    inverse 属性 在hibernate中通过对 inverse 属性的来决定是由双向关联的哪一方来维护表和表之间的关系. inverse = false 的为主动方.inverse = true ...

  4. 用仿ActionScript的语法来编写html5——第二篇,利用Sprite来实现动画

    上一篇,我已经模仿as,加入了LBitmap和LBitmapData类,并且用它们实现了静态图片的显示.这次用Sprite来动态显示图片.依然遵循上一篇对显示对象的处理的思路,添加LSprite类,并 ...

  5. mysql 从零学习

    一 .下载MySQL 访问MySQL的官网http://www.mysql.com/downloads/ 然后在页面中会看到“MySQL Community Server”下方有一个“download ...

  6. Linux vim 操作技巧

    ·Linux设计的重要原则是信息存储在基于文本的文件中 文本文件:无格式文件,作用类似于win的注册表(etc下的配置文件,.conf或者无扩展名)可扩展标记语言(XML),文本标记定义数据结构(et ...

  7. Vincent

    歌手Don McClean的Starry Starry Night,也有很多人叫这首歌为<Vincent> 编前:金色的向日葵.燃烧般的丝柏.风吹过的麦田.旋涡状的星体……,一幅幅狂嚣般的 ...

  8. 微信小程序将带来web程序员的春天!

    微信之父张小龙在年初那次演讲中曾表示:“我自己是很多年的程序员,我觉得我们应该为开发的团体做一些事情.”几个月后,微信正式推出微信应用号(即微信小程序)在互联网中掀起又一波热潮. 过去,对于很多开发者 ...

  9. PAT 天梯赛 L1-005. 考试座位号 【MAP标记】

    题目链接 https://www.patest.cn/contests/gplt/L1-005 题意 有一个 考生号,一个试机座位,一个考试座位,给出试机座位,查询 考生号和考试座位 思路 MAP + ...

  10. Django CRM 数据库增删改查

    原文链接 http://www.cnblogs.com/yangmv/p/5327477.html