jni java 字符串 转std::string 源码
时间: 2023-11-14 14:05:45 浏览: 156
您可以使用以下代码将Java字符串转换为std::string:
```cpp
#include <jni.h>
#include <string>
std::string jstringToString(JNIEnv* env, jstring jStr) {
if (jStr == nullptr) {
return "";
}
const char* chars = env->GetStringUTFChars(jStr, nullptr);
std::string str(chars);
env->ReleaseStringUTFChars(jStr, chars);
return str;
}
```
这个函数将接收一个JNIEnv指针和一个jstring对象,并将其转换为std::string对象。请确保在使用完GetStringUTFChars()函数后要调用ReleaseStringUTFChars()函数以释放字符串内存。
相关问题
jni 读取assets 文本文件的 实现源码
下面是使用JNI读取assets文本文件的实现源代码。
Java代码:
```java
public class AssetsUtil {
static {
System.loadLibrary("native-lib");
}
public static native String readAssetsFile(String fileName);
}
```
C++代码:
```c++
#include <jni.h>
#include <string>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_assetsutil_AssetsUtil_readAssetsFile(JNIEnv *env, jclass clazz, jstring fileName) {
const char *file_name = env->GetStringUTFChars(fileName, nullptr);
AAssetManager *asset_manager = AAssetManager_fromJava(env, clazz);
AAsset *asset = AAssetManager_open(asset_manager, file_name, AASSET_MODE_BUFFER);
env->ReleaseStringUTFChars(fileName, file_name);
if (asset == nullptr) {
return nullptr;
}
const void *data = AAsset_getBuffer(asset);
off_t size = AAsset_getLength(asset);
std::string content(static_cast<const char *>(data), static_cast<size_t>(size));
AAsset_close(asset);
return env->NewStringUTF(content.c_str());
}
```
在C++代码中,我们使用了`AAssetManager_fromJava`函数获取`AAssetManager`对象,并使用`AAssetManager_open`函数打开指定的assets文件,并使用`AAsset_getBuffer`函数获取文件内容的指针和`AAsset_getLength`函数获取文件大小。最后,我们将文件内容转换为字符串并返回。
阅读全文