本地方法取得Java属性/调用java方法

Vivado实战:UltraScale/UltraScale+器件eFUSE寄存器配置与安全编程全解析 本文详细解析了Xilinx UltraScale/UltraScale+器件中eFUSE寄存器的配置与安全编程方法。从芯片唯一身份标识到加密密钥烧录,再到用户寄存器的灵活应用和安全控制寄存器的配置技巧,全面介绍了如何利用eFUSE功能提升硬件安全性。文章还提供了JTAG接口安全管理和NKZ文件备份方案,帮助开发者避免常见陷阱,确保安全编程的可靠性。 阅读详情

(一)取得Java属性/设定Java属性值

1.取得相应属性的jfieldID之后就可以用
Set<TYPE>Field();
Get<TYPE>Field();
SetStatic<TYPE>Field();
GetStatic<TYPE>Field();
等函数对java属性进行操作b C++源码部分:

 


2.获取数组属性——>GetObjectField


3.例子:
a java 代码部分:

 

 

  1. package cn.itcast;  
  2.   
  3.   
  4.   
  5.   
  6. import java.util.Date;  
  7.   
  8. public class TestNative {  
  9.  public native void sayHello();  
  10.    
  11.  public int number = 10;  
  12.  public static void main(String[] args) {   
  13.    System.loadLibrary("nativeCode");//Java类  
  14.   
  15. 中加载DLL,然后调用声明的native方法  
  16.    TestNative tst=new TestNative();  
  17.    tst.sayHello();  
  18.    System.out.println(tst.number);  
  19.  }  
  20.   
  21. }  

 

b C++源码部分

 

  1. #include "cn_itcast_TestNative.h"  
  2. #include<iostream>  
  3. using namespace std;  
  4.   
  5.   
  6. JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello  
  7. (JNIEnv *env, jobject obj){  
  8.    // cout<<"Hello!"<<endl;  
  9.  //取得number属性值  
  10.  jclass clazz_TestNative = env->GetObjectClass(obj);  
  11.  jfieldID id_number = env->GetFieldID  
  12.   
  13. (clazz_TestNative,"number","I");  
  14.  jint number = env->GetIntField(obj,id_number);  
  15.   
  16.  cout<<number<<endl;//打印属性值  
  17.  //修改属性值  
  18.  env->SetIntField(obj,id_number,100L);  
  19. }  

 


(二)Java方法的调用

1.取得相应的jmethodID传入函数的参数中,就可以用
Call<TYPE>Method();
CallStatic<TYPE>Method();
CallNonvittual<TYPE>Method();
等函数对java函数进行调用 


2.调用形式


java中方法:
boolean function(int i , bouble d , char c){
    ···
}


//env->CallBooleanMethod(obj , id_function, 100L, 3.44 , L'3');//第一种调用函数形式

 

 

//第二种调用形式

 

jvalue * args = new jvalue[3];//存储参数的数组
args[0].i=100L;
args[1].d=3.44;
args[2].c=L'3';

env->CallBooleanMethod(obj , id_function , args);
delete [] args;//删除内存

 

3.调用例子
a java代码部分

  1. package cn.itcast;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class TestNative {  
  6.  public native void sayHello();   
  7.  double max(double num1,double num2){  
  8.   return num1>num2?num1:num2;  
  9.  }  
  10.    
  11.  public static void main(String[] args) {   
  12.   System.loadLibrary("nativeCode");//Java类  
  13.   
  14. 中加载DLL,然后调用声明的native方法  
  15.   TestNative tst=new TestNative();  
  16.   tst.sayHello();  
  17.  }  
  18.   
  19. }  

b C++源码部分

 

 

  1. #include "cn_itcast_TestNative.h"  
  2. #include<iostream>  
  3. using namespace std;  
  4.   
  5.   
  6. JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello  
  7. (JNIEnv *env, jobject obj){  
  8.  //取得number属性值  
  9.  jclass clazz_TestNative = env->GetObjectClass(obj);  
  10.                  jmethodID id_max=env->GetMethodID  
  11.   
  12. (clazz_TestNative,"max","(DD)D");  
  13.  jdouble maxvalue=env->CallDoubleMethod(obj,   
  14.   
  15. id_max,3.14,3.15);  
  16.  cout<<maxvalue<<endl;  
  17.   
  18.   
  19. }  

 

 

 

 

 

3.CallNonvirtual<TYPE>Method
如下java代码:
第一段
public class Father{
    public void function(){
        System.out.println("Father:func");
    }
}

 

第二段
public class Child extends Father{
    public void function(){
        System.out.println("Child:func");
    }
}

问题:如果出现以下代码,问其是调用哪个方法?
Father p = new Child();
p.function();

如下C++代码:
第一段
class Father{
    public:
       virtual void function(){//若加上virtual又如何
       cout<<"Father:func"<<endl;
    }
}

第二段
class Child: public Father
    public: void function(){
        cout<<"Child:func"<<endl;
    }
}

问题:如果出现以下代码,问其是调用哪个成员函数?
Father* p = new Child();
p->function();

在JNI中定义的CallNonvirtual<TYPE>Method就能够对子类对象调

用父类方法的功能。如果想要调用一个对象的父类方法,而不是子类

的这个方法的话,就可以使用CallNonvirtual<TYPE>Method

使用方式:
首先取得父类及要调用的父类方法的jmethodID
然后传入到这个函数就能通过子类对象呼叫被覆写(override)的父

类的方法

使用实例
(1)新增Father类

  1. package cn.itcast;  
  2.   
  3. public class Father {  
  4.  public void function(){  
  5.   System.out.println("Father:function");  
  6.  }  
  7. }  

(2)新增Child类

 

  1. package cn.itcast;  
  2.   
  3. public class Child extends Father {  
  4.   
  5.  public void function() {  
  6.   System.out.println("Child:function");  
  7.  }      
  8. }  

(3)java代码部分

 

  1. package cn.itcast;  
  2. import java.util.Date;  
  3. public class TestNative {  
  4.  public native void sayHello();  
  5.  public Father p = new Child();   
  6.  public static void main(String[] args) {   
  7.   System.loadLibrary("nativeCode");//Java类  
  8.   
  9. 中加载DLL,然后调用声明的native方法  
  10.   TestNative tst=new TestNative();  
  11.   tst.sayHello();  
  12.  }  
  13. }  

(4)C++源码部分
  1. #include "cn_itcast_TestNative.h"  
  2. #include<iostream>  
  3. using namespace std;  
  4.   
  5.   
  6. JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello  
  7. (JNIEnv *env, jobject obj){  
  8.   
  9.  jfieldID id_p = env->GetFieldID  
  10.   
  11. (clazz_TestNative,"p","Lcn/itcast/Father;");  
  12.  jobject p = env->GetObjectField(obj,id_p);//取得属性  
  13.   
  14.  jclass clazz_Father = env->FindClass  
  15.   
  16. ("cn/itcast/Father");//找到Father类  
  17.  jmethodID id_Father_function = env->GetMethodID  
  18.   
  19. (clazz_Father,"function","()V");//获取Father类里面方法的ID  
  20.   
  21.     //调用方法,取得的是子类方法  
  22.     env->CallVoidMethod(p,id_Father_function);  
  23.   
  24.   
  25. //相当于如下java代码  
  26.  //Father p = tst.p;  
  27.  //p.function();  
  28.   
  29.  env->CallNonvirtualVoidMethod  
  30.   
  31. (p,clazz_Father,id_Father_function);//调用父类方法  
  32.   
  33. }  

 

银河麒麟操作系统最佳实践专栏介绍 本专栏聚焦国产银河麒麟操作系统(桌面版/服务器版)的实战应用,提供系统安装、配置优化、应用部署、故障排查等实用指南。内容基于真实操作场景,涵盖Linux通用技术(如RAID配置、环境变量管理)、服务器系统专项(如数据库迁移、驱动安装、安全加固)及桌面系统技巧(如PXE安装、镜像封装)。面向IT运维、开发者和国产化转型人员,突出实战性和差异化,帮助用户规避常见问题,提升系统管理效率。所有教程均配有详细步骤和截图,确保可操作性,并持续更新适配新版系统。 阅读详情

相关推荐

用例设计:滴滴打车从轿车到完成支付如何测?

滴滴打车全流程测试用例设计从业务场景覆盖、功能逻辑分解、异常流验证三个维度展开,系统化地构建了测试方案。首先,业务流主干场景被分解为叫车、行程中、支付结算三个阶段,每个阶段都设计了核心测试用例,包括正向和异常用例,如定位准确性、车型选择逻辑、路径偏移监控、费用实时计算、多支付方式兼容等。专项测试补充了状态机验证、资损防控测试和性能测试,确保系统在不同情况下的稳定性和安全性。测试数据策略采用等价类划分设计,实战技巧包括流量回放技术、混沌工程注入和计费沙盒验证,以提高测试的覆盖率和准确性。最终输出交付物包括流程

海姐软件测试的博客 1524

2020-08-29笔记

第一个:Field Field是一个类,位于java.lang.reflect包下。在Java反射中Field类描述的是类的属性信息,功能包括: 获取当前对象的成员变量的类型 对成员变量重新设值 如何获取Field类对象 一共有4种方法: Class.getFields(): 获取类中public类型的属性,返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段 getDeclaredFields(): 获取类中所有的属性(public、protect

wangjunjie_123的博客 610

华为2024机考真题集合

2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以 2,所得的结果就是中位数。在实际考试中会随机抽三道题目进行考察,其中两道100分卷题和一道200分卷题,总共400分。幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。3.查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。1.众数是指一组数据中出现次数量多的那个数,众数可以是多个。

qq_25360769的博客 5093

Android NDK开发(九):JNI函数接口详解—本地层使用java类及实例

通过JNI层,本地层可间接操作java 类和实例的属性和方法,包括实例化类、set/get属性值、调用方法等。由于涉及的接口比较多,我们按功能进行分类说明。

u04160526 2357

Xarray实战:从气象数据到可视化分析的完整流程(附Python代码)

本文详细介绍了使用Xarray库处理气象数据的完整实战流程。针对气象领域常见的NetCDF和GRIB格式,文章从数据读取、坐标操作、智能索引、统计计算到高级可视化,提供了完整的Python代码示例。重点阐述了Xarray如何高效处理高维标记数据,帮助地球科学领域的研究人员将繁琐的数据处理工作转化为高效的分析流水线。

d6e7f8g9h的博客 290

[USACO2023-JAN-Bronze] T2 Air Cownditioning II 题解

[USACO2023-JAN-Bronze] T2 Air Cownditioning II题解

1652

android JNI 系列 三

主题: ● 获取Java类 ● 访问Java属性 ●访问Java方法 ●创建Java对象 ●抛异常   1. 获取Java类     方法一:     jclass clazz = env->GetObjectClass(thisObj);     方法二:     jclass cls = env->FindClass("com/lht/JNITest"); 以上方法是先

cs_lht的专栏 6257

最强AI插件Augment,适配idea、vscode,对标cursor!

Augment是一款新兴的AI辅助编码工具,能够无缝集成到IDEA和VS Code等主流IDE中,直接对标专业AI编码工具Cursor。其核心优势包括多IDE适配、无缝集成、代码理解与生成以及对话式编程体验。Augment通过插件形式保留原IDE功能和快捷键习惯,降低学习成本,同时提供深度理解项目上下文和生成高质量代码的能力。此外,Augment还具备审查变更、检查点、代理与代理自动等核心功能,支持从简单配置更改到复杂功能实现的各种开发任务。Augment代表了AI辅助编程工具的新方向,通过增强开发者熟悉的

todoitbo的博客 1万+

JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性

 JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性 Android JNI/NDK入门指南目录 JNI/NDK入门指南之正确姿势了解JNI和NDK JNI/NDK入门指南之JavaVM和JNIEnv JNI/NDK入门指南之JNI数据类型,描述符详解 JNI/NDK入门指南之jobject和jclass JNI/NDK入门指南之javah和javap的使用和集成 JNI...

ganklun的专栏 472

把 SAP BTP Destination 写进 MTA:一段 com.sap.application.content 配置背后的部署编排学

MTA内容模块解析:SAP BTP中的声明式部署机制 本文详细解析了mta.yaml中com.sap.application.content模块在SAP BTP云环境中的作用。该模块通过声明式配置实现内容投递,无需编译或部署代码。核心功能包括: Destination创建:通过content-target:true标识将配置投递到Destination服务 HTML5应用部署:将静态资源投递到HTML5 Application Repository 安全集成:配置XSUAA服务实现OAuth2用户令牌交换

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 165

【MATLAB代码】二维平面的TOA定位,GDOP(几何精度因子)和CRLB(克拉美罗下界)计算与输出

本文介绍了一个MATLAB程序,用于计算二维定位场景中的几何精度因子(GDOP)和克拉美罗下界(CRLB)。该程序针对单目标和四个锚点配置,通过网格扫描法计算空间各点的GDOP分布,并以等高线图可视化展示。程序还可计算特定位置的理论定位精度下限(CRLB),输出X/Y方向标准差和GDOP值。核心算法通过构建几何矩阵和费舍尔信息矩阵实现,考虑了测量误差影响,并处理了特殊位置情况。程序提供了完整的源代码和参数修改说明,适用于定位系统精度分析。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 803

JNI: 能否用 GetFieldID()/GetStaticFieldID()取得enum变量的属性?

没有问题的,jni下面一样可以动态获取的 仅供参考! VOID CVMAndroidDC::SetStyle() { static jmethodID jmidSetStyle=NULL; if(jmidSetStyle==NULL) { jclass jclsPaint=m_pJNIEnv->FindClass("android/graphics/Paint"); jmidS...

{丸の子} 1170

基于STM32、HAL库的IP5356M_DBZ_CA快充协议芯片简介及驱动程序设计

IP5356M_BATTERY_LEVEL_25 = 1, /* 电池电量25% */IP5356M_CHARGE_STATE_CHARGE_DONE = 4, /* 充电完成 */IP5356M_CHARGE_STATE_FAST = 2, /* 快速充电 */IP5356M_CHARGE_STATE_NONE = 0, /* 无充电 */IP5356M_CHARGE_STATE_PRE = 1, /* 预充电 *//* 延时1秒 */

corlin6688的博客 1417

JNI学习笔记3——本地方法取得Java属性/调用java方法

(一)取得Java属性/设定Java属性值1.取得相应属性的jfieldID之后就可以用SetField();GetField();SetStaticField();GetStaticField();等函数对java属性进行操作b C++源码部分:2.获取数组属性——>GetObjectField3.例子:a java 代码部分:package cn.itcast; import java.util.Date; public class TestNative { public n

jiben071的专栏 1951

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组

转自:http://blog.youkuaiyun.com/jiben071/article/details/6033613 JNI学习笔记1——开篇 JNI——java native interface (一)开篇 1.为什么要使用jni     Java有些时候需要调用本地代码(C/C++),jni接口提供了 java与操作系统本地代码互相调用的功能   2.最简单的j

Skypine_Lee的专栏 1234

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

c调用java方法_C/C++调用Java代码(属性和方法)

1.JNIEnv对象对于本地函数JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj){cout<}JNIEnv类型代表Java环境。通过这个JNIEnv*指针,就可以对Java端的代码进行操作。如,创建Java类得对象,调用Java对象的方法,获取Java对象的属性等。JNIEnv的...

weixin_39895283的博客 359

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java调用C/C++ API 讲解及代码示例

我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要调用本地方法,但是假如你遇到了以下情况,你可能就需要使用Java调用本地方法了: 你的Java代码需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。在本地还有一个别的系统,不过它不是Java语言实现的,这个时候你需要把两套系统整合到一起。你的Java代码中需要用到某

zgjxhgh 2385

使用Java调用C/C++

我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要调用本地方法,但是假如你遇到了以下情况,你可能就需要使用Java调用本地方法了: 你的Java代码需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。在本地还有一个别的系统,不过它不是Java语言实现的,这个时候你需要把两套系统整合到一起。你的Java代码中需要用到某

u014484902的专栏 443

04 jni调用java方法

JNI本地方法访问Java属性和方法 在JNI调用中,不仅仅Java可以调用本地方法,本地代码也可以调用Java中的方法和成员变量。在Java1.0中“原始的”Java到C的绑定中,程序员可以直接访问对象数据域。然而,直接方法要求虚拟机暴露他们的内部数据布局,基于这个原因,JNI要求程序员通过特殊的JNI函数来获取和设置数据以及调用java方法。 取得代表属性和方法的jfieldI...

studyforelectronics的博客 538

jni 对象 属性

//作者srx@csdn class pp{ public String tmp ; public void setTmp(String tmp_){ this.tmp = tmp_; } public String getTmp(){ return this.tmp ; } } class myCla...

thanq的博客 280

C/C++调用Java代码(属性和方法)

back&gt;&gt; 1. JNIEnv对象      对于本地函数 JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj){ cout&lt;&lt;"Hello Native Test !"&lt;&lt;endl; }      JNIEn...

287

c 调用 java jni_java JNI 的实现(2)-java和C/C++的相互调用.

目录概述从第一篇一,java代码:我们稍微对类做了更改,如下:1 packagejuk.demo;23 public classJSay {4 //member/class field.5 public static String country = "cn";67 public int age = 20;89 //native method.10 publ...

weixin_32121147的博客 247

C/C++调用Java代码(属性和方法)

转载:http://zzqrj.iteye.com/blog/12852621. JNIEnv对象 对于本地函数 JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj){ cout<<"Hello Native Test !"<<endl; } JNIEnv类型代表Java环

glen1943的专栏 508

简介jni(二)

打开创建的本地头文件,可以看见要实现c++的方法: /* * Class: com_cn_TestJni * Method: getjni * Signature: ()V */ JNIEXPORT void JNICALL Java_com_cn_TestJni_getjni (JNIEnv *, jobject); /* * Class: com_cn_

月清空的博客 1560

JNI:本地代码调用Java代码

1. 本地代码访问Java代码在被调用的C/C++函数中也可以反过来访问Java程序中的方法javah 工具生成的C/C++函数声明中,可以看到有两个参数:JNIEXPORT void J...

天行健,君子以自强不息;地势坤,君子以厚德载物。 747

JNI语法之数据类型和C访问Java属性和方法

Java属性与方法签名列表: java的方法签名可以用javap -s命令来拿到,进入到java项目的bin目录然后执行命令即可,如图所示: java文件: package com.tz.jni; import java.util.Random; import java.util.UUID; public class Test { public String nam

chuyouyinghe的专栏 614
上一篇: 本地代码创建Java对象(包括javaString)
下一篇: 本地方法处理java数组/引用问题/缓存jfieldID/jmethodID
vrix
博客等级 码龄24年 673粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值