NewString("foo", 3) 或 env->-6ren">
gpt4 book ai didi

java - 是否可以在 Android 上使用 JVM 字符串池在 JNI 中创建字符串?

转载 作者:行者123 更新时间:2023-12-02 12:11:00 25 4
gpt4 key购买 nike

据我所知,在Java中通过new String("foo")创建字符串会创建一个新副本,而不是潜在地使用字符串池中的现有字符串。我假设 env->NewString("foo", 3)env->NewStringUTF("foo") 的 JNI 也是这种情况,基于文档:“从 Unicode 字符数组构造一个新的 java.lang.String 对象。” 同样,我假设创建 native 字符串也是完全单独分配的:std::string bar = "foo";,因为 native 分配不使用堆。

显然,您可以在 Java 中使用一个变量(即 String bar = "foo";),该变量是对字符串池中副本的潜在引用,并将其作为j字符串。我很好奇是否有任何方法可以完全在 JNI 中创建一个可以使用 JVM 字符串池的字符串?如果没有,是否有任何最佳实践或建议来说明如何最大限度地减少创建/处理大量字符串的代码的内存使用量,这些字符串在 JNI 层(双向)传递用于许多操作?

旁注:我知道跨越 JNI 层的成本很高,而且我描述的基本情况会增加内存分配的费用。不幸的是,这是为现有 C++ 库构建“瘦”Java 表面以将其用作 Android 库的一部分,因此我充其量只是在尽力寻找优化方法。

最佳答案

实习:

jstring s = env->NewStringUTF("foo");
s = env->CallObjectMethod(s, internID);

其中internID是之前获取的String.intern()methodID

关于java - 是否可以在 Android 上使用 JVM 字符串池在 JNI 中创建字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46552208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com