当前位置: 首页 > 知识库问答 >
问题:

为什么整数和长的大小常数只有@native?

董飞
2023-03-14

但是,在阅读java源代码时,我注意到在integerlong类中,size常量是@native,而不是Float、Byte、Double、Short和character。

注意,SIZE常量表示用于表示实际值的位数。

public static final int SIZE = 8;//Byte
public static final int SIZE = 16;//Character
public static final int SIZE = 16;//Short
public static final int SIZE = 32;//Float
@Native public static final int SIZE = 32;//Integer
@Native public static final int SIZE = 64;//Long
public static final int SIZE = 64;//Double

编辑:我刚刚注意到,这也适用于相同类的max_valuemin_value

static const jint SIZE = 8L;//java/lang/Byte.h
static const jint SIZE = 16L;//java/lang/Character.h
static const jint SIZE = 16L;//java/lang/Short.h
static const jint SIZE = 32L;//java/lang/Float.h
static const jint SIZE = 32L;//java/lang/Integer.h
static const jint SIZE = 64L;//java/lang/Double.h
static const jint SIZE = 64L;//java/lang/Long.h

共有1个答案

商和雅
2023-03-14

TLDR:跳到结论

为什么整数和长的大小常数只有@native?

我在邮件列表上搜索了一下。我发现了一些有趣的东西。

/* No native methods here, but the constants are needed in the supporting JNI code */
@GenerateNativeHeader
public final class Long extends Number implements Comparable<Long> {...

因此创建了一个新的注释java.lang.annotation.native,并在Integer和long中使用。注释被设置为TargetType字段

注释应该直接应用于需要导出的常量字段,而不是作为一个整体应用于类。

这些东西的全部目的是:

我在JDK上做了一个基本的实验。我克隆了open-jdk森林并成功构建了它。正如所料,为integerlong生成的头文件(感谢@native)和为floatdouble生成的头文件(感谢它们的本机方法),而不是为byteshort...

    ls -l build/macosx-x86_64-normal-server-release/support/headers/java.base/java_lang_*
    ...
    java_lang_Double.h
    java_lang_Float.h
    java_lang_Integer.h
    java_lang_Long.h
    java_lang_Object.h
    java_lang_Package.h
    ...
    

然后,我尝试从integer字段中删除@native,并尝试重新构建JDK,但出现错误:

jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c:35:10: fatal error: 'java_lang_Integer.h' file not found
#include "java_lang_Integer.h"
         ^
1 error generated.

逻辑上,因为头尚未生成。

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Integer.h" {} \; -print
#include "java_lang_Integer.h"
./jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c
#include "java_lang_Integer.h"
./jdk/src/java.base/unix/native/libnio/ch/IOUtil.c
#include "java_lang_Integer.h"
./jdk/src/java.base/windows/native/libnet/TwoStacksPlainSocketImpl.c
#include "java_lang_Integer.h"
./jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c
#include <java_lang_Integer.h>
./jdk/src/java.desktop/windows/native/libawt/windows/awt_Frame.cpp

喜欢

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Long.h" {} \; -print
#include "java_lang_Long.h"
./jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c

喜欢float

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Float.h" {} \; -print
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/Float.c
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/ObjectInputStream.c
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/ObjectOutputStream.c

喜欢双倍

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Double.h" {} \; -print
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/Double.c
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/ObjectInputStream.c
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/ObjectOutputStream.c
find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Short.h" {} \; -print
 类似资料:
  • 我有点惊讶地看到为什么在我的机器上,数组的最大大小是整数.MAX_VALUE/7 我知道数组是由整数索引的,所以数组大小不能大于整数.MAX_VALUE。我还阅读了一些堆栈溢出讨论,我发现它在JVM上有所不同,并且JVM使用了一些(5-8咬)。 在这种情况下,最大值也应为。 和 之间的任何值都会给我错误: 这是我可以分配给机器上数组的最大值。具体原因是什么? 更新:我正在运行eclipse中的代码

  • 问题内容: 但是,如果用前导零检查Integer,则会发现问题是在jdk7发行之前进行的,因此其研究工作量较小。但是在jdk7中,对整数进行了一些更改和添加。以下是有关jdk7的最新答案。 我有一个代码: 编译时出现错误:整数太大:09 为什么这样做呢? 同样,如果我将代码更改为: 现在输出是10 为什么给输出10而不是12? 问题答案: 开头的数字被认为是八 - 9不是一个八进制数字(但(传统)

  • 问题内容: 如何将(大字节序)可变大小的二进制字节数组转换为(无符号)整数/长整数?例如,代表4404 现在,我正在使用 它虽然很小,但有点可读,但可能效率不高。有没有更好(更明显)的方法? 问题答案: 传统上,Python对于“大尾数C布局中的数字”用处不大,而对于C来说则用不了太多。(如果要处理2字节,4字节或8字节的数字,那么答案就是) 但是足够多的人厌倦了没有一种明显的方法可以做到这一点,

  • 我有一个h2数据库文件,文件大小已经增长到5GB。我删除了一些数据以缩小文件的大小。但即使从数据库中删除了一半记录,文件大小仍然保持不变。 我已经尝试了以下所有选项来减少数据库大小,但没有一个对我有用。 我的连接字符串如下所示: 注: 我们正在结清我们已经开始的交易 文件中没有5GB的数据 有人能给我建议一些解决方法或修复方法来减少我的数据库大小吗

  • 问题内容: 和pandas和之间的区别是什么? 大小是否仅排除nil? 问题答案: 含值,:

  • 问题内容: 在Java中,hashcode()方法返回整数而不是long。有什么具体原因吗? 问题答案: 那么,一个良好的理由是,基于数据结构(,)使用一个数组来存储箱,并且阵列被限制为索引。 如果必须将其映射到数组索引,那么您将一无所获。