JNI全攻略之三--JNI头文件分析

Java生成jni.h头文件,java调用C方法 图文详解 Java生成jni.h头文件,java调用C方法,举例说明(图文详解) 阅读详情

JNI全攻略之三--JNI头文件分析


JNI头文件分析

       为了分析JNI头文件,特意写了HeaderTest这个包含多个不同的native方法的测试类。


1.    测试文件HeaderTest.java

       这是一个相当简单的文件。前两个为成员变量、第三个为非本地方法,主要考察成员变量和非本地方法,是否在头文件中出现。后面一段是几种类型的本地方法,例如无输入无输出的本地方法、输入输出基本数据类型的本地方法、输入输出String类型的本地方法、输入输出java自定义的对象的本地方法、输出java自定义的接口的本地方法、输出自定义的对象的本地方法。后面的就是这几种类型对应的输入输出为数组的方法。最后总和的方法。在此类的外部有一个自定义的辅助类Student。本例中还考察private、friendly、public等访问权限对本地方法产生头文件的影响。以及方法重载对头文件中相应方法的影响……太罗嗦了!大家就看看下面的java文件吧!!!

import java.util.*;

public class HeaderTest{

       private int i = 0 ;

       float f = 0f;

       public void XXX(String s){

              ;

       }     

 

       private native void  doVoid();

       native int doShort();

       native void doArray(Object[] o );

       native int doInt(int i);      //byte ,short ,int,long,float,double ,boolean,char      

       native int doInt(double d);    //byte ,short ,int,long,float,double ,boolean,char

       native int doInt(Object o);    

       native int doInt(double d1,double d2);

       static native int doInt(double d1 ,double d2,double d3);

       static native int doInt(double d1 ,float f,boolean b ,char[] c );  

      

       native int doInt(int[] i);

       native int doInt(int[] i1,double[] i2 );    

       static native int doInt(int[] i1,double[] i2 ,Object[] o );

      

       public native String doString(String s);

       public native Object doObject(Object o );

       public native Enumeration doInterface(Iterator it);

       public native Student doStudent(Student s);

      

 

//     native int[] doInt(int[] i);  //byte ,short ,int,long,float,double ,boolean,char

       public native String[] doString(String[] s);

       public native Object[] doObjects(Object[] o );

       public native Enumeration[] doInterface(Iterator[] it);

       public native Student[] doStudent(Student[] s);

             

       public native static Object doAll(int[] i , String[] s , Student[] student );                       

}

 

class Student{}

二、头文件HeaderTest.h

       编译上面的文件,然后对编译后的类文件,使用javah命令,产生HeaderTest.h头文件。下面就是该头文件的一部分。

 

1.        

2.         #include <jni.h>

3.        

4.         #ifndef _Included_HeaderTest

5.         #define _Included_HeaderTest

6.         #ifdef __cplusplus

7.         extern "C" {

8.         #endif

 

9.        

14.     JNIEXPORT void JNICALL Java_HeaderTest_doVoid (JNIEnv *, jobject);

……

 

1.         #ifdef __cplusplus

2.         }

3.         #endif

4.         #endif

 

       为了阅读的方便,给此头文件加了行号!

三、JNI头文件的组成

       JNI头文件一般由三部分组成:1.头文件;2.本地方法的注册;3.本地方法在头文件中的表示。

1.        1-8 是C、C++的头,它包含了我们在VC工具中要使用的jni.h的头文件,以及其它的一些指令。(相信你对C、C++比较了解吧!不了解可以阅读相关书籍!我这里就不讲解了)

2.        以后的每隔6行就是一个本地方法对应的头文件中的方法。这些方法的注释部分包含Class、Method、和Signature三部分。Class当然就是具有此本地方法的类的名称了,在我们的例子中为HeaderTest;Method就是本地方法的名称了,我们例子中有如doStudent的方法;Signature是方法的标识,它是一个标识符,主要供我们在JNI操作java对象的方法使用的。本节只简单讲述其特征,具体使用见本博客的后续文章。

3.        接着就是一个本地方法在头文件中的表示了!例如:

              JNIEXPORT jobject JNICALL Java_HeaderTest_doObject (JNIEnv *, jobject, jobject);

 

四、分析

1.方法组成分析

       从上面的头文件可以看出:头文件包含以下7个部分:

       JNIEXPORT <JNIType> JNICALL Java_HeaderTest_doVoid (JNIEnv *, jobject);

              1        2       3    4      5       6        7

       我就简单地介绍这7个部分吧!

1)        JNIEXPORT(1)和JNICALL(3)都是JNI的关键字,表示此函数是要被JNI调用的。

2)        <JNIType>(2)为本地方法返回的数据类型,对应与java源文件中的该方法返回的数据类型

3)        Java(4)为JNI中标识此方法来源于java的标识头

4)        _HeaderTest(5)表示该方法所在的类。当该类在包中时前面会按次序加上包名。我将上面的类文件放入名为mxd的包中,相应的5部分就为mxd_HeaderTest了,其它类推吧!

5)        _doVoid(6)为JNI中对应与java文件中本地方法的方法名。这不是完全对应的哦!重载方法是一个例外!

6)        (JNIEnv *, jobject)(7)方法的最后一部分哦!比较复杂,它们有一个共同的特点,包含JNIEnv *――它是一个接口指针,用于定位函数表中的函数!在JNI规范中一般称为“Interface Pointer”。看到这儿好像和过程调用很类似了!是的,JNI中的操作过程,就是面向过程的!后面的jobject是一个指向该类的指针,类似与C语言中的this。这个第二个参数是变化的,当该方法为类的实例方法时该参数为jobject;当该方法为类方法(即静态方法)时该参数为jclass,指向该类的class。详细见下面。

 

2.java的数据类型和JNI中数据类型的映射

       以下是HeaderTest.java的源文件中的本地方法和HeaderTest.h头文件中的方法对照!

       private native void  doVoid();

       native int doInt(int i);      //byte ,short ,int,long,float,double ,boolean,char

       public native String doString(String s);

       public native Object doObject(Object o );

       public native Enumeration doInterface(Iterator it);

       public native Student doStudent(Student s);     

 

       native int[] doInt(int[] i);  //byte ,short ,int,long,float,double ,boolean,char

       public native String[] doString(String[] s);

       public native Object[] doObjects(Object[] o );

       public native Enumeration[] doInterface(Iterator[] it);

       public native Student[] doStudent(Student[] s);

 

JNIEXPORT void JNICALL Java_HeaderTest_doVoid (JNIEnv *, jobject);

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__I (JNIEnv *, jobject, jint);

JNIEXPORT jstring JNICALL Java_HeaderTest_doString__Ljava_lang_String_2 (JNIEnv *, jobject, jstring);

JNIEXPORT jobject JNICALL Java_HeaderTest_doObject (JNIEnv *, jobject, jobject);

JNIEXPORT jobject JNICALL Java_HeaderTest_doInterface__Ljava_util_Iterator_2 (JNIEnv *, jobject, jobject);

JNIEXPORT jobject JNICALL Java_HeaderTest_doStudent__LStudent_2 (JNIEnv *, jobject, jobject);

JNIEXPORT jintArray JNICALL Java_HeaderTest_doInt___3I (JNIEnv *, jobject, jintArray);

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doString___3Ljava_lang_String_2 (JNIEnv *, jobject, jobjectArray);

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doObjects (JNIEnv *, jobject, jobjectArray);

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doInterface___3Ljava_util_Iterator_2(JNIEnv *, jobject, jobjectArray);

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doStudent___3LStudent_2 (JNIEnv *, jobject, jobjectArray);

JNIEXPORT jobject JNICALL Java_HeaderTest_doAll (JNIEnv *, jclass, jintArray, jobjectArray, jobjectArray);

 

       从上面的对比可以看到:

1)        java中的返回值void和JNI中的void是完全对应的哦!(仅仅一个而已)。

2)        java中的基本数据类型(byte ,short ,int,long,float,double ,boolean,char-8种)在JNI中对应的数据类型只要在前面加上j就对应了(jbyte ,jshort ,jint,jlong,jfloat,jdouble ,jboolean,jchar)。

3)        java中的对象,包括类库中定义的类、接口以及自定义的类接口,都对应于JNI中的jobject。

4)        java中基本数据类型的数组对应与JNI中的j<type>array类型。(type就是上面说的8种基本数据类型)

5)        java中对象的数组对应于JNI中的jobjectArray类型。(在java中一切对象、接口以及数组都是对象)

 

       下图是JNI规范中java数据类型和JNI数据类型的映射图。

       第一幅为基本数据类型的映射图:

 

 

       第二幅为引用数据类型的映射图:

 

3.重载方法的区别

       以下是几个没有重载的方法及其在JNI头文件中对应的方法:

       private native void  doVoid();

       native int doShort();

       native void doArray(Object[] o );

 

JNIEXPORT void JNICALL Java_HeaderTest_doVoid (JNIEnv *, jobject);

JNIEXPORT jint JNICALL Java_HeaderTest_doShort (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_HeaderTest_doArray (JNIEnv *, jobject, jobjectArray);

       从上面的例子可以看出:没有重载的方法在JNI的头文件中对应的方法和java中本地方法的名称是一致的。

 

 

       以下是几个简单的重载方法:

       native int doInt(int i);      //byte ,short ,int,long,float,double ,boolean,char      

       native int doInt(double d);    //byte ,short ,int,long,float,double ,boolean,char

       native int doInt(double d1,double d2);

       static native int doInt(double d1 ,double d2,double d3);

       static native int doInt(double d1 ,float f,boolean b ,char[] c );

       native int doInt(Object o);    

 

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__I (JNIEnv *, jobject, jint);

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__D (JNIEnv *, jobject, jdouble);

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__DD(JNIEnv *, jobject, jdouble, jdouble);

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__DDD (JNIEnv *, jclass, jdouble, jdouble, jdouble);

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__DFZ_3C (JNIEnv *, jclass, jdouble, jfloat, jboolean, jcharArray);

JNIEXPORT jint JNICALL Java_HeaderTest_doInt__Ljava_lang_Object_2 (JNIEnv *, jobject, jobject);

       从上面的对比可以看出:重载方法时,方法的后面还有一个表示方法参数的“后缀”。例如上面操作的变量为Int时加一个表示此类型的标识“I”;多个类型当然依次加多个了;当某个变量为数组时在其类型前面会加一个“3”;当其为对象时后面会加一个“L”表示这是一个对象,以及一个该对象的路径,不过路径之间用“_”代替包路径的“.”或者文件路径的“/”哦!这对应于Signature。见后面!

 

 

       下面是复杂的例子:

       public native Student[] doStudent(Student[] s1);

       public native Student[] doStudent(Student[] s1,Student[] s2);

 

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doStudent___3LStudent_2 (JNIEnv *, jobject, jobjectArray);

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doStudent___3LStudent_2_3LStudent_2(JNIEnv *, jobject, jobjectArray, jobjectArray);

       从上面的例子可以看出,方法重载时,方法后要依次加上参数名称,前面知道了数组要在参数类型前加“3”,从上面的例子看出:参数为对象时对象名称后还要加上“2”,表示该参数为一个对象。

 

4.实例方法和静态方法的区别

       以下是本地实例方法和本地类方法的比较。红色的为java中的本地方法,蓝色的为JNI头文件中对应的方法。

       public native Student[] doStudent(Student[] s);

       public native static Object doAll(int[] i , String[] s , Student[] student );

 

JNIEXPORT jobjectArray JNICALL Java_HeaderTest_doStudent___3LStudent_2 (JNIEnv *, jobject, jobjectArray);

JNIEXPORT jobject JNICALL Java_HeaderTest_doAll (JNIEnv *, jclass, jintArray, jobjectArray, jobjectArray);

       从上面的比较可以看出:

       在本地实例方法中该参数为jobject,代表对象本身,在本地静态方法中该参数为jclass。这是它们的区别。关于如何操作代表该实例的jobject和操作该类的jclass请关注后续文章。

 

 

 

5.Signature

       在JNI头文件中提到Signature,它主要用于操作Java类中的方法。Signature一般由两部分组成:1.方法参数;2.方法返回值。

1.        方法参数包含在一个括号中,返回值在括号外!

2.        方法参数个数较多时会依次以“;”隔开。

3.        当参数或者返回值是基本数据类型时,必须用其在JNI中的描述符表示。下表就是Java基本数据类型对应的JNI中的描述符。

4.        方法参数或者返回值为java中的对象时,必须以“L”加上其路径,不过此路径必须以“/”分开,自定义的对象也使用本规则,不在包中时直接“L”加上类名称。

5.        当参数或者返回值为数组时,前面必须加上“[”!

 

       以上就是Signature表示方法的规则哦!看看下面一些Signature能一个个转换为相应的方法吗?

([LStudent;)[LStudent;

([I[Ljava/lang/String;[LStudent;)Ljava/lang/Object;

([LStudent;[LStudent;)[LStudent;

([Ljava/util/Iterator;)[Ljava/util/Enumeration;

([Ljava/lang/Object;)[Ljava/lang/Object;

([Ljava/lang/String;)[Ljava/lang/String;

(LStudent;)LStudent;

       能明白就好了!后续的使用JNI操作Java对象你可以入门了哦!!

6.其它

1.        类中的成员变量、非本地方法在JNI中是不会出现的。即javah产生头文件时只会关心本地方法。

2.        private、friendly、protected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类使用这些方法时有效!JNI中不关心此修饰符!

3.        当我们给HeaderTest.java指定一个包时,不仅头文件中的方法的前面加了包名,并且产生的头文件也变为mxd_HeaderTest.h。


转:http://blog.youkuaiyun.com/yjkwf/article/details/7006264


JNI 生成头文件的方法 需要注意的是,操作的时候需要将目录定位到class目录下(也就是 com.openailab.oascloud.security 的上一级),然后再执行以下命令生成 .h 头文件 $ javah -jni com.openailab.oascloud.security.jni.SmxJNI ... 阅读详情

相关推荐

C语言调用Java方法全攻略:JNI Invocation API 实战

本文详解通过 JNI Invocation API 在 C/C++ 中调用 Java 方法的全流程,涵盖 FindClass/GetObjectClass 获取类、方法签名与 ID 获取、Call 系列函数调用,并给出跨线程场景下通过 JavaVM 和全局引用安全调用的解决方案,附完整代码及常见陷阱。

学无止境 6044

jni.h 文件详解

else//代表了Java中包含native方法的类的一个实例//jclass代表的是一个类对象#endifjboolean z;jbyte b;jchar c;jshort s;jint i;jlong j;jfloat f;jdouble d;jobject l;} jvalue;//Object对象 L开头,包名/类名,”;”结尾,$标识嵌套类。

m0_51429482的博客 2784

Android NDK r28c Windows实战:环境配置到JNI调试全攻略

在Android开发中,当Java/Kotlin遭遇性能瓶颈或需复用C/C++库时,NDK(Native Development Kit)便成为连接原生代码与Android系统的关键桥梁。NDK为开发者提供了一套完整的交叉编译工具链,能够将C/C++代码编译为可在ARM或x86架构上运行的.so库。理解其核心原理,如ABI(Application Binary Interface)的匹配、API Level与minSdkVersion的适配,以及CMake构建系统的集成,是进行高效原生开发的基础。Windo

weixin_28693683的博客 579

Android jni头文件详解

jni头文件的源码解读

知识共享,你我皆是知识的搬运工 1307

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3039

Excel插件开发实战:从零封装一个带自定义Ribbon的.xlam工具包

本文详细介绍了如何从零开发一个带自定义Ribbon的Excel插件.xlam工具包。通过VBA和XML技术,读者将学习到插件架构设计、Ribbon界面定制、模块化开发以及企业级部署策略,帮助提升Excel自动化办公效率。

weixin_42531128的博客 516

JNI全攻略之一

建立一个简单的JNI程序<br />       本篇和大家简单地建立一个Java调用C++代码的程序!关于细节请关注本博客下周的文章。一、编写一个包含本地方法的类NativeHello.java<br />// NativeHello.java<br />public class NativeHello { <br />         public native void HelloWorld(String str); <br />         static { <br />            

490

深入解析Docker Overlay2磁盘空间占用问题及高效清理策略

本文深入解析了Docker Overlay2存储驱动导致磁盘空间占用的核心原因,包括镜像与容器残留、日志文件膨胀、应用层泄漏及驱动特性。提供了从全局检查到精准定位的完整排查方法,并给出了从常规清理到配置优化的多维度高效清理策略,帮助用户从根本上解决Docker磁盘空间问题。

data3的博客 900

JNI全攻略之二――JNI基础

JNI全攻略之二――JNI基础 一、基础知识        JNI-java native interface通常被成为Java本地方法,它是Java虚拟机实现的一部分,因此我们可以在任何的虚拟机上使用JNI。通过JNI我们可以完成和宿主计算机(就是安装JVM或者JDK的操作系统)以及在此系统上用C或C++语言写的本地程序了!以下是Java虚拟机、JNI以及宿主计算机、本地程序以及

2157

开关变换器小信号建模实战:从理论到环路设计

本文深入探讨了开关变换器小信号建模的实战技巧,从理论基础到环路设计全面解析。通过Buck和Boost变换器的具体案例,详细介绍了状态空间平均法、扰动法等关键建模技术,并分享环路补偿设计和实际调试中的宝贵经验。文章特别强调了小信号建模在电源设计中的重要性,为工程师提供了从理论到实践的完整解决方案。

weixin_29290259的博客 376

OFDM接收机同步——分组检测

上一篇讲了OFDM发射机中的长短训练序列生成原理,基于此可以得到长短训练序列的准确数值,为接收机中的符号同步中的相关运算提供基础。 进入符号同步前,首先来看OFDM接收机中的第一步——分组检测。分组检测就是检测突发传输方式的信道上是否有新的数据到达,算法的好坏直接影响着接收机的后续工作性能。 一、本文意义 基于《基于xilinx fpga 的ofdm的通信系统基带设计》这本教材中分组检测算法原理,通过matlab编程仿真验证“延时相关+保持长度”分组检测算法的有效性。同时,通过仿真证明教材上的判决公式的问题

boayel的博客 2201

JNI全攻略之一--建立一个简单的JNI程序

建立一个简单的JNI程序        本篇和大家简单地建立一个Java调用C++代码的程序!关于细节请关注本博客下周的文章。 一、编写一个包含本地方法的类NativeHello.java // NativeHello.java public class NativeHello {          public native void HelloWorl

2904

OpenClaw插件配置错误修复完全指南

插件文件名是插件目录结构正确package.json配置正确OpenClaw的插件系统还在快速迭代,偶尔会遇到这种配置问题。看错误信息检查配置文件检查实际文件对比差异修复问题大部分问题都能解决。查看官方文档:https://openclaw.ai/docs提Issue:https://github.com/openclaw/openclaw/issues加入Discord社区求助快速修复命令汇总。

Maynor的博客 4092

jni创建java对象_JNI全攻略之六――操作Java对象的属性

JNI全攻略之六――操作Java对象的属性江苏无锡缪小东本篇讲述如何在本地方法中操作java对象的属性。该属性可以是实例变量也可以是类变量。下面是两个例子。一、操作属性类的属性包含两种:实例变量和类变量。下面就分别讲解吧!(很多读者都说以前的关于JNI文章讲解太少了,不太能看懂,下面的文章我将比较详细地讲解。)1.1实例变量下面是一个包含一个本地方法的类,该类有基本数据类型型的属性、String类...

weixin_39798626的博客 357

第4章:外包接单全攻略——Upwork/电鸭/猪八戒从0到第一单

> - 三个外包平台的详细对比(适合人群、抽成、防骗) > - 每个平台的Profile优化模板(可直接复制修改) > - 用AI写Proposal的3个Prompt模板(我实测回复率提升50%) > - 报价策略与防骗指南(附5个危险信号) > - 我的第一单复盘:从注册到收款的全过程(含聊天记录脱敏)

sfishfly的博客 574

OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

数据集制作主要是在windows进行,比较方便。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3325

【Java开发300个实用技巧】27.JNI调用C++比JNA快10倍的方案

本文深入探讨了Java调用C++代码的性能优化方案,重点对比了JNI与JNA的性能差异,并提供了实战测试、避坑指南和进阶技巧。通过原理剖析,揭示了JNI在调用机制、数据类型转换和内存管理上的优势,使其性能提升可达10倍。实战部分展示了百万次调用的耗时对比和内存占用分析,证明了JNI的高效性。文章还列举了JNI开发中的五大陷阱,并提供了解决方案。最后,通过场景分析,指导开发者何时应选择JNI。本文旨在帮助开发者掌握JNI的正确使用姿势,实现系统性能的飞跃。

1215

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C 与 Java 混合编程实战(JNI 接口开发全攻略)

掌握C语言与Java的JNI接口开发,轻松实现跨语言高效调用。涵盖本地方法注册、数据类型映射与内存管理等核心技巧,适用于性能优化与系统级编程场景。实战演示无缝集成方案,提升开发效率,值得收藏。

FuncIsle的博客 631

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JVM 崩溃不可怕:hs_err_pid 日志分析全攻略

关键词:hs_err_pid、JVM crash、segfault、glibc、SIGSEGV、JIT、libzip、JNI阅读时长:18 min环境:CentOS 7 + OpenJDK 8u342 + gdb 7.6适合:1~6 年 Java 开发、生产崩溃复盘、面试「JVM 宕机怎么办」标准答案。

持续输出Java相关知识 1249

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JNI全攻略之六――操作Java对象的属性

JNI全攻略之六――操作Java对象的属性<br />       本篇讲述如何在本地方法中操作java对象的属性。该属性可以是实例变量也可以是类变量。下面是两个例子。一、              操作属性<br />       类的属性包含两种:实例变量和类变量。下面就分别讲解吧!(很多读者都说以前的关于JNI文章讲解太少了,不太能看懂,下面的文章我将比较详细地讲解。)1.1实例变量<br />       下面是一个包含一个本地方法的类,该类有基本数据类型型的属性、String类型的属性以及自定义类

703

JNI全攻略之——操作Java对象的属性

本篇讲述如何在本地方法中操作java对象的属性。该属性可以是实例变量也可以是类变量。下面是两个例子。 一、              操作属性        类的属性包含两种:实例变量和类变量。下面就分别讲解吧!(很多读者都说以前的关于JNI文章讲解太少了,不太能看懂,下面的文章我将比较详细地讲解。) 1.1实例变量        下面是一个包含一个本地方法的类,该类有基本

小码农大梦想 767

Radare2图形化界面全攻略:逆向分析so文件的5个高效技巧

本文详细介绍了使用Radare2图形化界面高效逆向分析Android so文件的五个核心技巧。内容涵盖从初始工作流构建、VV模式导航、快速定位JNI_OnLoad等关键函数,到信息整合标记以及结合动态调试的实战方法,旨在帮助逆向工程师提升分析效率,深入理解二进制程序结构。

fox11的博客 120

JNI 字符串传递性能优化全攻略(20 年专家实战经验倾囊相授)

解决JNI字符串传递性能瓶颈,深入剖析C语言与Java JNI的字符串传递机制。涵盖高频调用场景、局部引用优化与UTF-8编码处理技巧,显著提升跨语言交互效率。20年专家实战经验总结,值得收藏。

Instrustar的博客 294
上一篇: Android——DisplayMetrics之我见
下一篇: Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)
wx1qq1com
博客等级 码龄18年 123粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值