jni 代码取得传入参数的对象属性.

Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数) 我们知道Java是一个运行在虚拟机里面的高级的编程语言,如果要调用系统的动态链接库的话,就要先声明native修饰的方法(类似接口里面的方法),再由C/C++程序来实现(类似实现接口里的方法)。这样Java调用这些native方法就相当于调用了C/C++里面实现了的方法。通常我们把这种机制叫做JNI(Java NativeInterfac),即Java本地编程接口 Android也同理,要学会在Android上进行NDK开发,首先我们到打好java JNI的基础。现在我 阅读详情
class pp{
    public String tmp ;
    public void setTmp(String tmp_){
        this.tmp = tmp_;
    }
    public String getTmp(){
        return this.tmp ;
    }
}
class myClass{
    public pp a ;
    public pp b ;
    public pp getA(){
        return a;
    }
    public pp getB(){
        return b;
    }
    public void setA(pp a_){
        this.a = a_;
    }
    public void setB(pp b_){
        this.b = b_;
    }
}
public class test {
    static{
        System.loadLibrary("c-so-jni");
    }
    public native void fun(myClass param);
    public native void myprintf();
   
    public static void main(String[] args) {
        test obj = new test();
        //obj.myprintf();//just for test jni.
        myClass param = new myClass();
        param.a = new pp(); param.a.tmp="aaa";
        param.b = new pp(); param.b.tmp="bbb";
        obj.fun(param);
       
    }
}
------------------------------ javah -jin test 生成test.h ----------------------------------
test.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */

#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test
 * Method:    fun
 * Signature: (LmyClass;)V
 */
JNIEXPORT void JNICALL Java_test_fun
  (JNIEnv *, jobject, jobject);

/*
 * Class:     test
 * Method:    myprintf
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_test_myprintf
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
---------------------------------- 建立C Manage Project ,类型选择Share Library----------------
c-so-jni.h
#ifndef CSOJNI_H_
#define CSOJNI_H_
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */

#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test
 * Method:    fun
 * Signature: (LmyClass;)V
 */
JNIEXPORT void JNICALL Java_test_fun
  (JNIEnv *, jobject, jobject);
 
  /*
 * Class:     test
 * Method:    myprintf
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_test_myprintf
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
#endif /*CSOJNI_H_*/
----------------------------c-so-jni.c------------------------------------------------
#include "c-so-jni.h"

JNIEXPORT void JNICALL Java_test_fun
  (JNIEnv *env, jobject obj, jobject param){
      //在这里我如何得到myClass 对象param的各个属性?
      //并且修改他们后传回给java程序?     
      jclass cls = (*env)->FindClass(env,"myClass");
     
      // get myClass.a
      jfieldID fid = (*env)->GetFieldID(env,cls,"a","Lpp;");
      jobject pro = (*env)->GetObjectField(env,param,fid);
     
      // get myClass.a
      jmethodID mid_getA = (*env)->GetMethodID(env,cls,"getA","()Lpp;");
    jobject ppObj = (jobject)(*env)->CallObjectMethod(env,param,mid_getA);
   
    //get pp.tmp
    jclass pp_cls = (*env)->FindClass(env,"pp");
//    jmethodID mid_getTmp =(*env)->GetMethodID(env,pp_cls,"getTmp","()Ljava/lang/String;");
//    jstring tmpstr =(jstring) (*env)->CallObjectMethod(env,pro,mid_getTmp);
    jfieldID fid_pp_tmp = (*env)->GetFieldID(env,pp_cls,"tmp","Ljava/lang/String;");
    jstring pptmp = (jstring)(*env)->GetObjectField(env,pro,fid_pp_tmp);
    char * str =(char*) (*env)->GetStringUTFChars(env,pptmp,NULL);

      printf("fun myclass.a.tmp=[%s]/n",str);
 }

JNIEXPORT void JNICALL Java_test_myprintf
  (JNIEnv * env, jobject obj){
      printf("hello");   
}
---------------------------------over -----------------------------------------
在最后的c-so-jni.c中,实现了,取得java对象,获得其属性.
的方法.
也可以获得java对象,调用它的方法.
c-so-jni.c中施用的类型例如,()Ljava/lang/String;可施用java明令获得.
例如,javap -s -public pp
javap -s -public myClass

------------ 输出如下:---------------
[shirx@localhost bin]$ javap -s -public myClass
Compiled from "test.java"
class myClass extends java.lang.Object{
public pp a;
  Signature: Lpp;
public pp b;
  Signature: Lpp;
public pp getA();
  Signature: ()Lpp;
public pp getB();
  Signature: ()Lpp;
public void setA(pp);
  Signature: (Lpp;)V
public void setB(pp);
  Signature: (Lpp;)V
}

[shirx@localhost bin]$ javap -s -public pp
Compiled from "test.java"
class pp extends java.lang.Object{
public java.lang.String tmp;
  Signature: Ljava/lang/String;
public void setTmp(java.lang.String);
  Signature: (Ljava/lang/String;)V
public java.lang.String getTmp();
  Signature: ()Ljava/lang/String;
}
  
android studio 3.2 使用jni 在android studio 3.2中本人调用jni不使用nkd-build这个方式而是采用cmake的方式。 下面是主要内容: jni文件的建立 jni的基本实现 jni传参 环境配置: 在SDK Tools中要添加CMake LLDB NDK点击OK,等待下载完成,下载完成后,重启Android Studio 开始新建JNI项目 直接新建一个项目,注意在“Include... 阅读详情

相关推荐

JNI高阶知识总结

JNI与NDK的关系NDK可以为我们生成了C/C++的动态链接库,JNI是java和C/C++沟通的接口,两者与android没有半毛钱关系,只因为安卓是java程序语言开发,然后通过JNI又能与C/C++沟通,所以我们可以使用NDK+JNI来实现“Java+C”的开发方式。JNIEnv与JavaVMJNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ;

WangShuo的专栏 2381

用Delphi开发JNI(Java Native Interface)应用(二)

要正确地访问类对象的成员属性(字段)及成员方法,最重要的一点是一定要给出正确的签名,在Java中对于数据类型和方法的签名有如下的约定: 数据类型/方法 签名 byte ...

baiseda 147

11、rsa-目标主机支持RSA密钥交换【原理扫描】的漏洞

通过将 etcd 的 TLS 密钥交换算法从 RSA 升级为 ECDHE,可实现前向保密,彻底消除 “私钥泄露导致历史流量解密” 的风险。核心步骤是通过强制启用含ECDHE的套件,并禁用 RSA 密钥交换套件,同时建议升级到 TLS 1.2+ 并优化证书类型(优先 ECDSA)。这一配置符合云原生安全最佳实践,也是 Kubernetes 等依赖 etcd 的系统推荐的安全标准。生成临时密钥的具体步骤是什么?如何验证etcd是否已成功更新为ECDH密钥交换算法?配置临时密钥交换算法可能带来哪些性能影响。

xuebo1129927648的博客 1万+

android ndk 开发jni调用对象方法,数组参数

一、JNI和NDK关系         JNI是Java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI 是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。         NDK是一系列工具的集合。它提供了一系列的

wulongkou的博客 1008

JAVA进阶面试题:如何设计一个高并发系统?

如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先。 如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿 offer 基本如探囊取物,没啥问题。面试官也绝对不会这样来问你,否则他就是蠢。 假设你在某知名电商公司干过高并发系统,用户上亿,一天流量几十亿,高峰期并发量上万,甚至是十万。那么人家一定会仔细盘问你的系统架构,你们系统啥架构?怎么部署的?部署了多少台机器

uuop155的博客 1020

FileZilla Server 1.2.0 TLS证书过期问题

FileZilla Server TLS证书过期后重新生成

Wigle的备忘录 7527

jni传入out参数_想了解JNI与C++的关联吗

背景在很多时候Java调用动态库文件使用JNA是比JNI体验更好,但有时候你会发现JNA也一样会出现错误的调用结果,这个时候我们需要C++底层语言去做调用动态库文件,其好处是非常高效且准确。但是C++语言怎么与java互通使其能通过java的语言调用C++里写的方法呢?方法答案是JNI,JNI是Java Native Interface的缩写,是java本地接口直通底层语言的纽带,他可以与C++完...

weixin_39533361的博客 182

Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

mumufan05的专栏 878

【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

I . JNI 线程创建 II . 线程执行函数 III . 线程方法获取 Java 对象 IV . 线程方法获取 JNIEnv V . JNI 线程 完整代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2451

YOLO26涨点改进 | 独家创新,注意力改进篇 | AAAI 2025 | YOLO26引入 DRM 防御优化模块,进行特征优化/特征增强,助力目标检测、图像分类、图像分割有效涨点

本文提出了一种基于DRM防御优化模块改进的YOLO26网络模型,显著提升了目标检测的鲁棒性和特征提取能力。DRM模块通过优化特征提取过程、增强抗噪声能力和补充细节信息,有效提高了模型在复杂场景下的检测精度和定位准确度。该模块可集成于UNet等主干网络,采用Transformer结构实现特征精炼,在对抗攻击环境下仍能保持稳定的融合效果。实验表明,改进后的模型在红外与可见光图像融合任务中表现出色,同时提升了下游任务性能。文章详细介绍了DRM模块的结构、作用机制及实现代码,并提供了两种YOLO26改进方案.

Ai缝合怪、助力小伙伴高效发论文 144

MobaXterm简介和使用(服务器连接工具)

MobaXterm 是一个功能强大的远程计算工具,集成了许多常用的远程计算功能,包括 SSH、X11、RDP、VNC、FTP、SFTP 等。

清平乐的技术专栏 1950

jni 取java对象数组_Android JNI访问Java成员

在 JNI 调用中,不仅仅 Java 可以调用本地方法,本地方法也可以调用 Java 中的方法和成员变量。Java 中的类封装了属性和方法,想要访问 Java 中的属性和方法,首先要获得 Java 类或 Java 对象,然后再访问属性、调用方法。在 Java 中类成员指静态属性和静态方法,它们属于类而不属于对象。而对象成员是指非静态属性和非静态方法,他们属于具体一个对象,不同的对象其成员是不同的,...

weixin_39993301的博客 956

从数据库到数据仓库:数据仓库导论

本文为数据仓库导论,旨在介绍数据仓库的基本理念和应用场景,帮助读者理解数据仓库的重要性及其在企业中的实际应用。

探索大数据世界 - 深入解析数据存储、分布式计算与人工智能 2784

android jni传入接口,Android逆向—JNI接口

JNI是Java Native Interface的英文缩写,类似一种标准,提供了很多的API,使Java可以和C/C++进行通信。而JNI接口正是Java层世界与C/C++语言世界之间的桥梁。探究:为什么使用JNI呢?1.使用现有的开源库,现在很多优秀的开源库都是用C/C++编写的。2.代码的保护,Android APK的Java代码容易被反编译,而C/C++更难 反编译。3.便于移植,用C/...

weixin_42108948的博客 389

从零开始学Agent的搭建——多角色项目需求分析框架实战

场景一:电商促销需求——技术细节顾此失彼团队用单Agent分析一个"双11秒杀系统"的需求。Agent输出了完整的功能清单,但当我们拿着这份方案找架构师评审时,发现了致命问题:Agent完全没有考虑库存扣减的并发一致性、Redis与MySQL之间的数据同步延迟、以及超卖风险的控制策略。原因是单Agent在处理"业务理解"任务时,已经耗尽了它的"注意力预算",技术深度分析几乎为空。场景二:ERP集成需求——跨系统边界模糊。

软件行业技术文化交流。 535

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JNI-Native代码访问Java代码(一)

上一篇文章给大家介绍了怎样使用JNI来调用Native代码,在被调用的C/C++函数中也可以反过来访问Java程序中的类,接下来给大家讲解怎样使用Native代码访问Java代码。 .h头文件分析 在上一篇文章中我们使用javah 命令生成的头文件(.h)中有两个非常重要的参数,具体代码如下: JNIEXPORT void JNICALL Java_com_jony_nativetest_T

Inspiration 3585

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[JNI]开发之旅(6)JNI函数中访问java类中对象的属性

JNI函数的实现在c/c++中实现的,如果想访问java中定义的类对象的实例域需要三个步骤: 1.通过GetObjectClass()函数获得该对象的类class,返回值是一个jclass; 2.调用GetFieldID函数得到需要访问的实例域(变量)在该c类中id 3.调用Get【Type】Field()得到访问的变量值。其中【Type】对应变量的类型。 例如:java中有一个int a...

猫的阁楼 4012

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JNI学习笔记4——本地代码创建Java对象(包括javaString)

(一)在C/C++本地代码中创建JAVA对象1.java对象的创建(1)函数NewObject可以创建java对象(2)GetMethodID能够取得构造方法的jmethodID,如果传入的要取得的方法名称设定为“”就能够取得构造方法(3)构造方法的方法返回值类型的签名始终为Void(4)例子:jclass clazz_date = env->FindClass("java/util/Date");jmethodID mid_date = env->GetMethodID(clazz_date,"","()

jiben071的专栏 4893

jni 传递java对象,如何使用JNI传递和接收对象

I have an JAVA application in that I want to pass the object as a parameter to the C code using JNI and again I want to receive the object from the C code to JAVA using JNI.In JAVA side i have simply ...

weixin_33369808的博客 513

jni 传递java对象_Android JNI 传递对象

JNI初步入门后,在传递数据的时候,遇到一个需求:有多个数据需要在Java与C代码之间进行传递。如果都做为函数参数传入,则函数很长很难看,并且多个数据的返回也不好实现。所以想到了把数据打包后传递。这在C语言中就是结构体,在Java中就是类了。我们要做的工作就是,先确定要传递的数据,然后相应在C与Java中定义相应的数据类型,然后通过JNI进行数据对应。下面以一个例程来逐步说明。为了更好的说明各种数...

weixin_29695991的博客 1323

学习android JNI的那些事儿--------6. 在java中传入引用数据类型(对象)作为参数

之前我们介绍过在java中传入一些基本数据类型作为参数在jni中的处理,这里我们来介绍下载java中传入我们自定义的一个对象作为参数。 我们先自定义一个class为student public class Student { private String name; private int number; Student(){ name = ""; number = 0; }

zhangjie201412的专栏 3857

Java代码中参数类型与JNI代码中参数类型对应关系

方法的Signature 方法的Signature是由方法的参数和返回值的类型共同构成的,下面是他们的结构: "(argument-types)return-type" 其中Java程序中参数类型和其对应的值如下: Signature  Java中的类型 Z       boolean B       byte C       char S       short I        int J        long F       float D       double L fully-qualifi

baidu_35757025的博客 772

你应该了解的JNI知识(二)——Java与JNI互相调用

在你应该了解的JNI知识(一)——静态注册与动态注册中,了解了JNI是如何使用的,以及两种注册方式的使用以及区别。本篇博客将介绍Java和JNI的互相调用,因此主要包括两部分: JNI层调用Java层 Java层调用JNI、Native层 JNI层调用Java层 JNI层调用Java层有点类似Java的反射机制,需要首先找到类、再找到某个方法或字段,再进行调用。 这里涉及JNIEnv的几个方法...

xingfeng_coder的博客 1325

Android JNI cpp文件创建 java bean 对象并返回

具体的使用方式都在代码里面了。 首先准备一个 Student 和 Person class Student { var name: String? = null; var age: Int? = 0; } class Person { constructor(){ Log.e("Person", "无参构造器"); } constructor(age: Int) { Log.e("Person", "age = $age");

Lud的博客 599

JAVA JNI

JNI全称为Java Native Interface. 它可以简单理解为是本地方法的接口,即允许在Java虚拟机里面的Java代码可以和如C,C++等其他底层语言进行交互(即可互相调用)。一般情况下,当你无法用纯Java来实现需求的时候,就需要使用JNI来用底层语言编写的本地方法来满足这些该需求。例如以下的几种场景可能需要用到JNI:Java库无法提供基于平台系统相关特性的功能,如平台特有的功能或接口等。已经用其他语言写好的库,需要用Java调用,而不想重现编码,而想直接复用它们。

liuning1985622的博客 1461
上一篇: jni 代码
下一篇: 反射机制创建10000个对象的性能.
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值