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的更多相关文章
随机推荐
- python中,有关正则表达式re函数:compile、match、search、findall
1.全局匹配函数 re.compile(pattern=pattern,re.S).findall(text)函数: compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对 ...
- Spoken English Practice(not always estimating your status in other's hearts. you will lose yourself when you live in other's look. do your best and walk on you own way.)
绿色:连读: 红色:略读: 蓝色:浊化: 橙色:弱读 下划线_为浊化 口语蜕变(2017/7/8) 英 ...
- 使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行解档
一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序 ...
- 服务不支持 chkconfig 的解决方法
系统服务,在chkconfig --add servername的时候老是提示服务不支持 chkconfig,经过查找,解决办法如下. 示例,auto_run的前三行如下:#!/bin/sh#chk ...
- PHP去除所有的空格
1.去除两边的空格 trim($arr) 2.正则匹配去除所有的空格 preg_replace('# #','',$goodid)
- django博客项目8:文章详情页
首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...
- Python变量和基本数据类型
1.变量 a .什么是变量 变量即变化的量,核心是“变”与“量”二字,变即变化,量即衡量状态. b.为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能 ...
- Linux(1)- 服务器核心知识、Linux入门、VMware与centeos安装、远程连接linux、linux基本命令使用
一.服务器核心知识 1.电脑和电脑的硬件组成 现在的人们几乎无时无刻不在使用着电脑!不管是桌上型电脑(桌机).笔记型电脑(笔电).平板电脑,还是智慧型手机等等,这些东西都算是电脑.虽然接触这么多,但是 ...
- 解决127.0.0.1 localhost 劫持问题
在一个安装iis的过程中,把网站部署上去之后就发现127.0.0.1或者localhost都会跳转到一个莫名的网站,发现断网之后就是会跳转到一个Http://www.76636.com 类似这种的网站 ...
- python删除目录下七天前创建的文件
#coding=utf-8 import os import time import datetime def deleteOutdateFiles(path): """ ...