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的更多相关文章
随机推荐
- Python2 显示 unicode
用户想要看的是 u'中文' 而不是 u'\u4e2d\u6587',但是在 Python2 中有时并不能实现. 转译 转义字符是这样一个字符,标志着在一个字符序列中出现在它之后的后续几个字符采取一种替 ...
- As of Flume 1.4.0, Avro is the default RPC protocol.
Flume 1.8.0 Developer Guide — Apache Flume http://flume.apache.org/FlumeDeveloperGuide.html The remo ...
- 安装Centos 7操作系统
一.安装前准备 VMware workstation.CentOS-7-x86_64 系统镜像. 二.开始新建虚拟机 选择典型-下一步 选择稍后安装操作系统-下一步 选择LINUX-CentOS ...
- 【我的Android进阶之旅】 解决bug: Expected file scheme in URI: content://downloads/my_downloads/12
一.错误描述 今天测试MM用HTC手机测试某个模块的时候crash了,抓log后发现是使用DownloadManager下载apk安装包然后自动安装的时候,抛了异常:java.lang.Illegal ...
- [intellij]create gradle project
https://intellij-support.jetbrains.com/hc/en-us/community/posts/206806425/comments/206797339
- Hadoop的分布式架构改进与应用
1. 背景介绍 谈到分布式系统,就不得不提到Google的三驾马车:GFS[1],MapReduce[2]和BigTable[3]. 虽然Google没有开源这三个技术的实现源码,但是基于这三篇开源 ...
- [Python] Send emails to the recepients specified in Message["CC"]
Recently, I'm working on a small program which needs to send emails to specific accounts. When I wan ...
- python16_day15【Django入门】
一.Django基本 1.什么是框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表 ...
- day3-set集合
set是一个无序且不重复的元素集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- 一篇文章吃透iOS、JS的时间日期(Date, Calendar, Locale, TimeZone)
iOS 时间相关类 NSDate - 表示一个绝对的时间点. NSCalendar - 代表一个特定的日历,例如公历或者希伯来日历.它提供了一系列基于日期的计算,并且可以让你在"NSDate ...