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=; 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的更多相关文章
随机推荐
- SpringBoot专题2----springboot与schedule的激情相拥
Schedule:计划,任务.就是我们常说的定时任务.这在我们做一些系统的时候,是经常需要用到的.比如:定时更新一些数据,定时更新索引,都需要这样的一个功能. 第一:创建一个名为springboot- ...
- The OpenCV Coding Style Guide
https://github.com/opencv/opencv/wiki/Coding_Style_Guide
- vue-cli注册全局组件
在main.js开头引入组件,然后注册组件,例如: import Vue from 'vue' import VueRouter from 'vue-router' import VueResourc ...
- tornado.web.StaticFileHandler
tornado.web.StaticFileHandler 源代码中的解释 class StaticFileHandler(RequestHandler): """A s ...
- EXP直接导出压缩问津,IMP直接导入压缩文件的方法
在10G之前,甚至在10G的Oracle环境中,有很多数据量不大,重要性不太高的系统依然采用EXP/IMP逻辑导出备份方式,或者,作为辅助备份方式. 通常情况下,我们都是这样操作的:1.exp导出2. ...
- 008-查看JVM参数及值的命令行工具
1. HotSpot vm中的各个globals.hpp文件 查看jvm初始的默认值及参数 globals.hpp globals_extension.hpp c1_globals.hpp c1_g ...
- iptables练习题(四)
设有一台Linux服务器,利用iptables作为防火墙,要求新建一条名为MYCHAIN的新链,来实现只允许开放本机的http服务,其余协议和端口均拒绝. 脚本: [root@miyan ~]# ca ...
- Ubuntu学习笔记1-基本部分
Vim相当于vi的升级版 Find p*.txt支持查找通配符 Echo 回显命令 echo hello >1.txt 追加命令,不覆盖 echo hello >1.txt 覆盖命 ...
- curl简介、安装及使用
目录 curl简介 curl安装 curl使用 curl简介 curl是Linux下一个强大的文件传输工具,它利用URL语法在命令行方式下工作,支持文件上传和下载. curl安装 Ubuntu系统键入 ...
- Linq To Object多字段组合唯一校验
1.第一种方式 if(partsSalesOrderTypes.GroupBy(entity => new { entity.Name, entity.Code }).Any(array =&g ...