NewStringUTF和GetStringUTFChars 的差别

NewStringUTF 和 GetStringUTFChars 是 JNI(Java Native Interface)提供的两个函数,它们都用于在 JNI 代码中处理字符串,但用途和行为有所不同:

NewStringUTF
功能:NewStringUTF 用于在 JNI 代码中创建一个新的 Java 字符串对象。它接受一个 UTF-8 编码的 C 字符串作为输入,并在 Java 虚拟机中创建一个新的与之对应的 Java 字符串对象。
原型:
c

jstring NewStringUTF(JNIEnv *env, const char *bytes);

用途:当你需要从 C 或 C++ 代码中传递字符串到 Java 层时,可以使用这个函数。例如,你可能在本地方法中需要返回一个字符串给 Java 代码。
内存管理:由 JNI 自动管理,不需要手动释放。
GetStringUTFChars
功能:GetStringUTFChars 用于从 Java 字符串对象获取一个指向其 UTF-8 编码的 C 字符串的指针。这个函数允许你在 JNI 代码中读取 Java 字符串的内容。
原型:
c

const char* GetStringUTFChars(JNIEnv *env, jstring str, jboolean *isCopy);

用途:当你需要在本地代码中处理 Java 字符串的内容时,比如将其传递给一个只接受 C 风格字符串的本地函数。
内存管理:返回的指针必须在不再需要时通过调用 ReleaseStringUTFChars 函数来释放,以避免内存泄漏。isCopy 参数如果非 NULL,JNI 会设置它来指明返回的是否是原始字符串数据的副本,这在调用 ReleaseStringUTFChars 时很重要。
主要差异
方向:NewStringUTF 是从 C/C++ 到 Java 的字符串转换,而 GetStringUTFChars 是从 Java 到 C/C++ 的转换。
内存管理:使用 GetStringUTFChars 时,你需要手动管理内存,调用 ReleaseStringUTFChars 来释放字符串。而 NewStringUTF 创建的字符串由 JVM 自动管理。
用途:NewStringUTF 通常用于 JNI 方法返回字符串,而 GetStringUTFChars 用于在本地方法中读取 Java 字符串。
使用这些函数时,正确管理内存和确保字符串正确转换是非常重要的,以避免内存泄漏和数据不一致的问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
获取安卓设备的IMEI和Mac地址需要使用安卓系统的API,可以使用C++调用Java代码来实现。 获取IMEI的代码示例: ```c++ #include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_example_androidimei_MainActivity_getIMEI(JNIEnv *env, jobject /* this */) { jclass contextClass = env->FindClass("android/content/Context"); jfieldID fieldID = env->GetStaticFieldID(contextClass, "TELEPHONY_SERVICE", "Ljava/lang/String;"); jstring jstr = (jstring)env->GetStaticObjectField(contextClass, fieldID); const char* str = env->GetStringUTFChars(jstr, NULL); jclass telephonyManagerClass = env->FindClass("android/telephony/TelephonyManager"); jmethodID getSystemServiceID = env->GetMethodID(contextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); jobject telephonyManager = env->CallObjectMethod(thisObj, getSystemServiceID, env->NewStringUTF(str)); jmethodID getDeviceIDID = env->GetMethodID(telephonyManagerClass, "getDeviceId", "()Ljava/lang/String;"); jstring imei = (jstring)env->CallObjectMethod(telephonyManager, getDeviceIDID); env->ReleaseStringUTFChars(jstr, str); return imei; } ``` 获取Mac地址的代码示例: ```c++ #include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_example_androidimei_MainActivity_getMacAddress(JNIEnv *env, jobject /* this */) { jclass contextClass = env->FindClass("android/content/Context"); jfieldID fieldID = env->GetStaticFieldID(contextClass, "WIFI_SERVICE", "Ljava/lang/String;"); jstring jstr = (jstring)env->GetStaticObjectField(contextClass, fieldID); const char* str = env->GetStringUTFChars(jstr, NULL); jclass wifiManagerClass = env->FindClass("android/net/wifi/WifiManager"); jmethodID getSystemServiceID = env->GetMethodID(contextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); jobject wifiManager = env->CallObjectMethod(thisObj, getSystemServiceID, env->NewStringUTF(str)); jmethodID getConnectionInfoID = env->GetMethodID(wifiManagerClass, "getConnectionInfo", "()Landroid/net/wifi/WifiInfo;"); jobject wifiInfo = env->CallObjectMethod(wifiManager, getConnectionInfoID); jmethodID getMacAddressID = env->GetMethodID(wifiInfoClass, "getMacAddress", "()Ljava/lang/String;"); jstring macAddress = (jstring)env->CallObjectMethod(wifiInfo, getMacAddressID); env->ReleaseStringUTFChars(jstr, str); return macAddress; } ``` 注意:上述代码中的`Java_com_example_androidimei_MainActivity_getIMEI`和`Java_com_example_androidimei_MainActivity_getMacAddress`是Java代码的方法名,需要替换成你自己的方法名。此外,还需要在AndroidManifest.xml中添加对应的权限,例如获取IMEI需要添加`<uses-permission android:name="android.permission.READ_PHONE_STATE"/>`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

f4ck3sdn

初心:希望为更多人知识解惑

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值