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的更多相关文章
随机推荐
- Less-css扩展多样式
//扩展Extend Use Method:以在study上扩展多个的样式为例 //Share style 1 .style1{ width:200px; height:15px; color:#ff ...
- Python2在Sublime Text3中print中文时编译报错解决办法
如果是用记事本新建的python文件,有可能是由于记事本默认的ascii格式导致的,这个时候只需要在Sublime Text3中 文件->设置文件编码(utf-8),保存即可.这样能够解决的 ...
- delphi 一些知识文章地址记录(正则)
正则运用:http://www.cnblogs.com/del/archive/2007/12/21/1008108.html
- Powershell Get-FileHash
File Hash (Get-FileHash C:\fso\myfile.txt).hash Get-FileHash C:\Users\Andris\Downloads\Contoso8_1_EN ...
- html常见兼容性问题
html常见兼容性问题? 1.双边距BUG float引起的 使用display 2.3像素问题 使用float引起的 使用dislpay:inline -3px 3.超链接hover 点击后失效 ...
- 高性能网站服务器的架设优化-Nginx优化
一:对于高性能网站 ,请求量大,如何支撑?思路 在网站架构设计中,大家一定对 LNMP (Linux Nginx Mysql Php) 不陌生.LNMP 确实是一个非常优秀的架构,秉承着自由,开放,高 ...
- JavaScript dotAll模式
JavaScript正则表达式中点(.)是一个特殊字符,它可以匹配除了一下条件的任意字符. 四个字节的UTF-16字符 换行符(\n) 回车符(\r) 行分隔符 段分隔符 为了使点(.)可以匹配任意字 ...
- PHP的语言结构和函数的区别
相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...
- paper reading:gaze tracking
https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Krafka_Eye_Tracking_for_CVPR_2016_ ...
- Java加密技术(四)非对称加密算法RSA
RSA 这样的算法1978年就出现了.它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作.也非常流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir ...