JNI传递修改自定义Java Class数组数据
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635
结合前面讲的2篇关于JNI的文章,这里直接把代码贴上,主要是要知道如果传递自定义Class Array的时候,在JNI怎么处理。单独拎出来讲解,是因为和系统自带类型如long Array、String等的处理还是往往会有所区别的。可以做了写代码时迷惑时的一个参考。
自定义POJO类
package com.testjni;
public class AObject
{
int a;
int b;
public int getA()
{
return a;
}
public void setA(int a)
{
this.a = a;
}
public int getB()
{
return b;
}
public void setB(int b)
{
this.b = b;
}
/**
* {@inheritDoc}
*/
@Override
public String toString()
{
final StringBuilder sb =
new StringBuilder("AObject").append('[').append("a=").append(a).append(",b=").append(b).append(']');
return sb.toString();
}
}
Java测试类
package com.testjni;
public class TestJNI
{
public native boolean testJobjectArray(AObject[] aObjects);
static
{
System.load("D:\\eclipseWebWorkSpace\\testest\\src\\com\\testjni\\libTestJNI_amd64.dll");
}
public static void main(String[] args)
{
TestJNI testJNI = new TestJNI();
AObject[] aObjects = new AObject[3];
for (int i = 0; i < 3; i++)
{
aObjects[i] = new AObject();
}
for (int i = 0; i < 3; i++)
{
System.out.println("aObjects[" + i + "]=" + aObjects[i]);
}
testJNI.testJobjectArray(aObjects);
System.out.println("\n\n\nafter modified by jni");
for (int i = 0; i < 10; i++)
{
System.out.println(i + "-->" + aObjects[i]);
}
}
}
JNI头文件com_testjni_TestJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_testjni_TestJNI */
#ifndef _Included_com_testjni_TestJNI
#define _Included_com_testjni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_testjni_TestJNI
* Method: test_jobjectArray
* Signature: ([Lcom/testjni/AObject;)Z
*/
JNIEXPORT jboolean JNICALL Java_com_testjni_TestJNI_testJobjectArray
(JNIEnv *, jobject, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
JNI 源码文件com_testjni_TestJNI.cpp
#include <stdio.h>
#include "com_testjni_TestJNI.h"
#include "jni.h"
static const char* const AObjectClassPath = "com/testjni/AObject";
JNIEXPORT jboolean JNICALL Java_com_testjni_TestJNI_testJobjectArray(JNIEnv *env, jobject obj, jobjectArray aObjects)
{
jint arrLen = env->GetArrayLength(aObjects);
printf("\narrLen=%d", nArrLen);
jclass aObjectClass = env->FindClass(AObjectClassPath);
if (aObjectClass == NULL)
{
return true;
}
jfieldID afield = env->GetFieldID(aObjectClass, "a", "I");
jfieldID bfield = env->GetFieldID(aObjectClass, "b", "I");
for (int i = 0; i < 3; i++)
{
jobject aObject = env->GetObjectArrayElement(aObjects, i);
env->SetIntField(aObject, afield, i*i);
env->SetIntField(aObject, bfield, i*(i+1));
}
}
编译命令
cl /LD D:\eclipseWebWorkSpace\testest\src\com\testjni\com_testjni_TestJNI.cpp -o D:\eclipseWebWorkSpace\testest\src\com\testjni\libTestJNI_amd64.dll
运行结果:
before modified by jni
aObjects[0]=AObject[a=0,b=0]
aObjects[1]=AObject[a=0,b=0]
aObjects[2]=AObject[a=0,b=0]
after modified by jni
aObjects[0]=AObject[a=0,b=0]
aObjects[1]=AObject[a=1,b=2]
aObjects[2]=AObject[a=4,b=6]
arrLen=3
关键的方法就是GetObjectArrayElement,取出jobjectArray中的元素,然后对这些自定义Class对象进行操作。
JNI传递修改自定义Java Class数组数据的更多相关文章
- Android中关于JNI 的学习(三)在JNI层訪问Java端对象
前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...
- 实现JNI的另一种方法:使用RegisterNatives方法传递和使用Java自定义类 (转)
原帖地址:http://blog.csdn.net/qiuxiaolong007/article/details/7860610 除了使用传统方法实现JNI外,也可以使用RegisterNatives ...
- Java中使用自定义类封装数组,添加类方法实现数据操作
1.具体见注释 2.后续或有更新 public class MyArray { private long[] array; private int cnt; // 自定义数组类的元素个数 /** 使用 ...
- JNI中修改(基本类型)参数并返回到Java层使用
最近在JNI相关项目中遇到一个问题:在Java层传入多个int类型的参数,在jni层修改参数值或地址之后重新返回到Java层.这应该算是基本知识了,尤其是基本类型的参数往往看似简单,所以在之前学习jn ...
- Java 从数组来看值传递和引用传递
从数组来看值传递和引用传递 惯例先看一段代码 public class DemoCollection14 { public static void main(String[] args) { Stri ...
- 从文件中读取数组数据————Java
自己总结一下Java文件的读取类似数组数据的方法,自己可以快速查看. 一.规整化数据: 对于数组数据是一一对应的情况 ArrayList<String> arrayList = new A ...
- JNI C创建Java字符串数组
创建Java字符串数组 注:jni中没有与String[]对应的数据类型,所以需要创建对象数组,循环添加jstring对象 #include <Sample3.h> #include &l ...
- 转:Java修改Excel单元格的数据及格式
https://blog.csdn.net/aking21alinjuju/article/details/6001153?locationNum=2 继前两节的Java读取.写入Excel后,本期将 ...
- [z]protobuf实现c++与java之间的数据传递,beancopy数据到前台
[z]http://blog.csdn.net/xhyzdai/article/details/46684335 定义proto文件 option java_package = "com.w ...
随机推荐
- 最初步的.NET MvcApi + Vue 前后端分离IIS部署
一.完成项目,各个项目部署在IIS上 1.前端项目部署 完成项目后在控制台npm run build 生成了dist文件夹 主要是部署这个文件夹 打开IIS 和部署AspNet MVC项目一 ...
- pig安装配置及实例
一.前提 1. hadoop集群环境配置好(本人hadoop版本:hadoop-2.7.3) 2. windows基础环境准备: jdk环境配置.esclipse环境配置 二.搭建pig环境 1.下载 ...
- JAVA面试题0 JAVA语言的基本知识
JAVA语言的特点是什么? >面向对象:两个基本概念:类和对象:三大基本特性:封装.继承.多态: >健壮性:java吸收了C/C++的优点,但是去掉了它们影响健壮性的部分,例如指针和内存申 ...
- Spring boot application.properties和 application.yml 初学者的学习
来自于java尚硅谷教程 简单的说这两个配置文件更改配置都可以更改默认设置的值比如服务器端口号之类的,只需再文件中设置即可, properties可能是出现的比较早了,如果你不调你的默认编码,中文可能 ...
- MongoDB_02简介
MongoDB简介 MongoDB是一个开源,高性能,无模式的文档型数据库. 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以他既可以存储比较复杂的数据类型,又相当的灵活. Mon ...
- poj3405 Corporate Identity
和上一个1226一样吧,这个还不用翻转 然而本蒟蒻还是写不对,WA一片天,不知道自己搞什么,自从去了长沙感觉就是坑啊 while(1) iq--; /*#include <cstdio> ...
- Windows10 网络图标消失 连接不上网络 的解决方法
[背景]电脑win10的,下载一个软件重启之后网络图标消失,并且无法联网. 参照此解决方法: 原因: [Windows Event Log]服务对应的注册表出现问题,导致无法正常启动,进而导致一些依赖 ...
- 五、JavaScript之点击按钮调用相关JavaScript函数
一.代码如下 二.执行之后 三.点击按钮之后,内容被改变
- 一条 SQL 在 Apache Spark 之旅
转载自过往记忆大数据 https://www.iteblog.com/archives/2561.html Spark SQL 是 Spark 众多组件中技术最复杂的组件之一,它同时支持 SQL 查询 ...
- java向python ,text文件动态传参或传值问题完美解决
由于业务需要对python文件进行参数传递,通过下面两个java方法完美解决此问题,我的思路是:首先我要先把上次写的参数删除,第二我要新的参数写到python文件中. 第一个方法解决了删除上次传递的参 ...