JNI之类型介绍

NDK  2023年7月21日 am8:08发布1年前 (2023)更新 91es.com站长
43 0 0

前言

之前对JNI基本的使用以及很熟悉了,但也是值得部分基础内容,这次就记录一下JNI中的基础类型,方便自己查阅。

正文

之前我们知道,JNI中是不认识java类型的(int好像认识,哈哈),比如我们之前的boolean在JNI是jboolean类型,之前涉及的类型不对,今天就深入了解一下其他类型。

基本类型

下面是本类型和本地等效类型

Java 类型     本地类型    说明

boolean     jboolean    无符号, 8 位
byte        jbyte       无符号, 8 位
char        jchar       无符号, 16 位
short       jshort      有符号, 16 位
int         jint        有符号, 32 位
long        jlong       有符号, 64 位
float       jfloat      32 位
double      jdouble     64 位
void        void        N/A

除了void一样,其他的都是在基础类型上加了前缀j,还是比较容易机记住的。

PS: JNI中用jint和int都是可以用的

当然,jni中为了方便,有些宏定义,比如

#define JNI_FALSE 0
#define JNI_TRUE 1

哈哈,跟C语音一样,非零即真。

typedef jint jsize;

jsize整数类型用于描述主要指数和大小 。

引用类型

JNI中有很多对应于java对象的引用类型。

下面是引用类型的组织层次结构。

jobject                  (所有java对象)
  jclass                (Class对象)
  jstring               (String对象)
  jarray                (数组)
    jobjectArray         (object数组)
    jbooleanArray        (boolean数组)
    jbyteArray           (byte数组)
    jshortArray          (short数组)
    jintArray            (int数组)
    jlongArray           (long数组)
    jfloatArray          (float数组)      
    jdoubleArray         (double数组)
  jthrowable              (Throwable对象)

值类型

jvalue联合类型在参数数组中用作单元类型 。

typedef union jvalue {
    jboolean z;
    jbyte b;
    jchar c;
    jshort s;
    jint i;
    jlong j;
    jfloat f;
    jdouble d;
    jobject l;
} jvalue

目前没怎么用,不太理解,略过。

类型签名

JNI使用Java虚拟机的类型签名表

类型签名    Java类型
Z           boolean
B           byte
C           char
S           short
I           int
J           long
F           float
D           double
L           fully-qualified-class ; 全限定的类
[           type type[]
(           arg-types ) ret-type 方法类型

举个例子

#java native_computer
public native int native_computer(String type, int a, int b);
#对应的类型签名
(Ljava/lang/String;II)I

# java  multiply
public static int multiply(int x, int y) {
    return x * y;
}
#对应的类型签名
(II)I

规则很简单,但偶尔可能转不过来,推荐使用javac和 javap进行转换。具体看《JNI静态注册》中的介绍。

参考文章

  1. JNI完全手册]》

 历史上的今天

  1. 2022: You must not call setTag() on a view Glide is targeting(0条评论)
  2. 2021: 海子:为什么你不生活在沙漠上(0条评论)
  3. 2019: 汪曾祺:手把肉(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Fragment生命周期的详情

最近在看Android 6.0 Settings的源码,Fragment在很多地方都在使用,因此今天有空就复习一下。一图胜千言,直接看图。(下图来源互联网)图1、Fragment图2、Activity上面是Fragment和Activity(这个很熟悉吧)各自的生命周期,他们有些相同之处...

林清玄:路上的情书

我捡过一封诀别的情书。情书上有这样看来普通的句子:“当初是我选择了你,心里明知与你不会长久,还是执着的选择了你。”“这些日子以来,谢谢你陪我走过这一段路。”“你是一个很好的人,你一定会认识比我好上千倍的女孩。”“由衷地希望在没有我的日子,你依然过得好。”会捡到这封情书是很偶然的。有一天我在...

Android 修改ListView快速滚动条的bar

前言最近需要使用修改ListView快速滚动条的bar,ListView是可以默认支持的,但就是太丑了,需要定制一下。下面就记录一下自己使用的方法。好记性不如烂笔头正文本文并非原创,感谢网友分享。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读

[摘]WindowManager.LayoutParams的各种flag含义

FLAG_ALLOW_LOCK_WHILE_SCREEN_ON只要这个window对用户是可见的,则允许在屏幕开启的时候锁定屏幕这个flag可以单独的使用,也可以配合FLAG_KEEP_SCREEN_ON和(或者) FLAG_SHOW_WHEN_LOCKED使用FLAG_DIM_BEHIND...

乔叶:曾经这样爱过你

曾经这样爱过一个人:爱的人知道,被爱的人不知道,这是暗恋吗?爱着的时候,就整天鬼迷心窍地琢磨着你。你偶然有句话,就想着你为什么要这样说?你在说给谁听?有什么用?你偶然的一个眼神掠过,就会颤抖,欢喜,忧伤,沮丧。怕你不看自己,也怕你看到自己。更怕你似看不看的余光,轻轻地扫过来,又飘飘地带过去,...

Android Studio快捷键记录

在使用编译器时,很多人喜欢改变编译器的一些快捷键以便适应以前的习惯(以前我也是这样,后来发现换电脑或者环境后得耗时间重新配置,麻烦),但个人觉得不太好.如果编译器崩溃了或者换电脑了,您又得重新设置一遍...当然,萝卜青菜,各有所爱.只要自己喜欢怎样折腾都是好的!当然,Android Studio...