- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 JNI,我需要将一个 jstring 解析为一个 const char*,它工作正常,直到我传入一个长度超过 87 个字符的字符串。这是 Java 代码:
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append('.');
for(int i = 86; --i >= 0;) {
stringBuilder.append('a');
}
System.out.println(stringBuilder.length()); //I used this to check the length until I got to the point where it would start returning random characters.
myFunction(stringBuilder.toString()); //It's not actually called myFunction.
这是 C++ 代码:
const char* keyPathNative = env->GetStringUTFChars(keyPath, JNI_FALSE);
env->ReleaseStringUTFChars(keyPath, keyPathNative);
std::cout << keyPathNative << std::endl;
我只包含了相关的部分。这是输出:
88
Ð0~
如果我再次执行相同的代码,它会给出不同的输出:
88
`¢¶
有人能告诉我为什么会发生这种情况和/或如何解决它吗?
最佳答案
不要这样做:
env->ReleaseStringUTFChars(keyPath, keyPathNative);
std::cout << keyPathNative << std::endl;
来自JNI documentation对于 GetStringUTFChars
:
Returns a pointer to an array of bytes representing the string in modified UTF-8 encoding. This array is valid until it is released by
ReleaseStringUTFChars()
.
keyPathNative
指向的内存可能在 ReleaseStringUTFChars
之后被释放,因此尝试在 ReleaseStringUTFChars
之后引用该内存将导致未定义的行为.
关于java - JNI : converting jstrings longer than 87 characters returns random characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31201417/
我的 Java 类中有一个字符串变量: public class myclass { protected final String file; myclass(String f) {
JNIEXPORT int JNICALL Java_com_ndkfoo_test_GL2JNILib_step2(JNIEnv * env, jobject obj, jstring fileP
我一直在尝试调用具有以下签名的 C 函数 int changeFoo(L_TCHAR* pszFileSrc){....} 在我的 JNI 调用中,我的方法如下所示: JNIEXPORT jint J
当我尝试将 WCHAR_T* 传递给 java 方法时,应用程序崩溃了。 我有 WCHAR_T* 变量及其长度。 我知道如何将它转换为 jstring 以调用 java 方法。 我的 C++ 代码:
这是我的 JNI C 代码: JNIEXPORT jint JNICALL Java_org_avuna_httpd_util_CLibJNI_bind(JNIEnv * this, jclass c
C++ 端看起来像这样: JNIEXPORT jint JNICALL Java_Myclass_showMessage (JNIEnv* env, jobject obj, jstring titl
我正在调用一个返回字符串的 Java 函数: QAndroidJniObject obj = QAndroidJniObject::callStaticObjectMethod("HelloJava"
我对JNI知之甚少|以及内部的处理方式 JNI环境。我有一个简单的问题。 我在 Java 中有一个方法调用 JNI方法并传递一个 String在参数中。 JNI方法在 jstring 中接受该字符串对
#include #include "Package_MyTester.h" jstring Java_Package_MyTester_NMethod (JNIEnv *env, jobject
假设在 C++ 端,我的函数采用类型为 jstring 的变量,名为 myString。我可以将其转换为 ANSI 字符串,如下所示: const char* ansiString = env->Ge
我正在使用下面的 JNI 代码将 jchararray 转换为 jstring,但我在 Linux 中只获得第一个字符。 char *carr =(char*)malloc(length+1); (
我需要在我的 native 代码中使用 const char * 所以,我将 java 端的参数作为 jstring 并使用以下语句 JNIEXPORT int JNICALL JNIFUNCTION
我正在尝试将 wstring 从我的 cpp 代码转换为 jstring。 我知道有一个名为 NewStringUTF 的方法可以从 std::string 获取 jstring(当然是在从该字符串获
我的 cpp 代码包含一个我希望转换为 const char* 的 jni 函数。这是我正在使用的代码 extern "C" { void Java_com_sek_test_JNITest_prin
我正在使用 basic_string类型并需要将其转换为 jstring 以通过 JNI 层。我想知道最好的方法是什么。我有一个函数可以给我 std::string来 self 的 basic_str
我正在尝试将 C++ std::string 转换为 jstring 并将其返回。这将很容易 JNIEnv*->NewStringUTF(stdString.c_str()) 但问题是我正在转换的字符
我通过使用 JNI 将一个 URL 字符串从 Java 传递到 C 代码作为 jstring 数据类型。我的库方法需要一个 char * 作为 url。 如何在 char * 中转换 jstring
我正在尝试为现有 C++ 代码创建 Java 接口(interface)。 我的功能之一与此类似: JNIEXPORT jstring JNICALL Java_com_testproxy_Nativ
我们最近从 Jerkson 切换到 json4s,很快发现这两个库的默认反序列化行为大相径庭。 我们遇到的一个问题是我们有时会收到 json 输入,其中数字字段表示为字符串而不是数字 //exampl
我在 unix 中将 wstring 转换为 jstring 时遇到问题,因为 linux 上 wchar_t 的大小为 4 个字节(不像 Windows 是 2 个字节,因此我无法将 wchar_t
我是一名优秀的程序员,十分优秀!