据我所知,在Java中,通过new String("foo")
创建一个字符串会创建一个新副本,而不是使用字符串池中的现有副本。我假设JNI中env->NewString("foo", 3)
或env->NewStringUTF("foo")
的情况也是如此,基于以下文档:"Constructs a new java.lang.String object from an array of Unicode characters."
同样,我假设创建本机字符串也是完全单独分配的:{{ 1}},因为本机分配不使用堆。
你显然可以在Java中使用一个变量(即std::string bar = "foo";
),它是对字符串池中副本的潜在引用,并将其作为jstring传递给JNI。我很好奇是否有任何方法可以在JNI中完全创建一个可能使用JVM字符串池的字符串?如果没有,是否有关于如何最小化内存使用的最佳实践或建议,以创建/处理大量字符串,这些字符串通过JNI层(在两个方向上)传递给许多操作?
旁注:我理解穿越JNI层是昂贵的,而我所描述的基本情况增加了内存分配的开销。不幸的是,这是为现有C ++库构建“瘦”Java表面以作为Android库使用的一部分,所以最好我试图找到优化方法的方法。
答案 0 :(得分:1)
实习生:
jstring s = env->NewStringUTF("foo");
s = env->CallObjectMethod(s, internID);
其中internID
是之前获得的methodID
String.intern()
。