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 ...
随机推荐
- 001.Delphi插件之QPlugins,一个最简单的插件
安装QPlugins里面的Demo,复制粘贴着写了一个最简单的插件,看看好不好用 EXE代码如下: unit Main_Frm; interface uses Winapi.Windows, Wina ...
- 洛谷P1000 超级玛丽游戏(洛谷新手村1-1-1)
题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...
- Web application architecture overview
- #pragma命令详解
每种C和C++的实现支持对其宿主机或操作系统唯一的功能.例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式.#pragma指示使每个编译程序在保留C和C++语言的整体兼容 ...
- C#常用类库简介(二)
原文出处:http://blog.csdn.net/weiwenhp/article/details/8140503 C#常用类库简介(一)的地址 System与mscorlib这两个dll中的类库是 ...
- Java之集合
前言: 在写程序当中,集合会经常使用,今天听了马老师的课,写一些自己的总结 正文: 集合最重要的就是一个图,一个类,三个知识点,六个接口 说到图就是上面的图,这个图可以帮我们理解这些接口的继承关系 1 ...
- Result Maps collection already contains value for com.xxx.x.dao.xxxMapper.Bas
springboot启动时候,报错如下: Result Maps collection already contains value for com.xxx.xx.dao.xxxxxMapper.Ba ...
- .Net 笔记
1.介绍 .net一般指.Net Framework框架.一种平台,一种技术. C#是一种编程语言,可以开发基于.net平台的应用. .Net Framework是框架是.Net平台不可缺少的一部分, ...
- JS - n次方计算
pow 方法返回底表达式的指定次幂. Math.pow(base, exponent) 参数base 必选项.表达式底的值. exponent 必选项.表达式的指数值.
- spctl命令返回的结果输入到文本中
说一下我遇到的问题. mac自动打包完之后上传到苹果商店公正,公正后需要检查一下公正的结果, spctl -a -v LBCast.app #查看是否公证成功 显示如下表示公证成功了,有Notar ...