static jstring getProperty_native(JNIEnv *env, jobject clazz, jstring key){ jstring value = NULL; if(uniwinService == NULL || key == NULL){ throw_NullPointerException(env,"uniwin service has not start!"); } const char *ckey = env->GetStringUTFChars(key, NULL); char *cvalue = new char[PROPERTY_VALUE_MAX]; if(cvalue == NULL){ env->ReleaseStringUTFChars(key, ckey); throw_NullPointerException(env,"fail to allocate memory for value"); } int ret = uniwinService->getProperty(ckey, cvalue); if(ret > 0){ value = env->NewStringUTF(cvalue); if(value == NULL){ ALOGE("Fail in creating java string with %s", cvalue); } } delete[] cvalue; env->ReleaseStringUTFChars(key, ckey); return value; }
时间: 2024-04-26 10:24:19 浏览: 83
这是一个通过JNI实现的本地方法,方法名为getProperty_native,返回值为jstring类型。该方法需要传入三个参数:JNIEnv *env表示JNI环境,jobject clazz表示Java对象,jstring key表示属性的键值。该方法的作用是获取属性的值,并返回一个jstring类型的值。具体实现如下:
1. 首先判断服务是否已经启动,以及传入的key是否为NULL,如果是则抛出NullPointerException异常。
2. 将jstring类型的key转换为const char*类型的ckey,方便后续使用。
3. 通过new运算符分配一块内存,用于存储属性的值,如果分配内存失败,则抛出NullPointerException异常。
4. 调用uniwinService的getProperty方法获取属性的值,并将值存储到cvalue中。如果获取成功,则通过env->NewStringUTF方法将cvalue转换为jstring类型,并将其赋值给value。
5. 释放cvalue占用的内存,以及ckey占用的内存。
6. 返回获取到的属性值value。
该方法的实现中还使用了一些自定义的异常处理函数,比如throw_NullPointerException,用于在发生异常时抛出自定义的NullPointerException异常。
相关问题
JNIEXPORT jint JNICALL Java_MyNativeClass_myNativeMethod(JNIEnv *env, jobject obj, jobject surfaceObj, jstring strObj) 参数解析
`Java_MyNativeClass_myNativeMethod`是JNI接口函数,它的参数含义如下:
- `JNIEnv *env`:JNI环境指针,可以通过它调用JNI接口函数。
- `jobject obj`:Java对象,即调用JNI接口函数的对象。
- `jobject surfaceObj`:Java对象,即Surface对象。需要使用Android NDK中的`ANativeWindow`接口将其转换为C++中的对象。
- `jstring strObj`:Java对象,即字符串对象。需要使用JNI接口函数将其转换为C++中的字符串。
`JNIEXPORT jint`表示JNI接口函数返回值类型为`jint`,即C++中的`int`类型。
#include <jni.h> #include <string> JNIEXPORT jstring JNICALL Java_com_android_pilotxxx_PilotJni_getString(JNIEnv *env, jobject obj) { return env->NewStringUTF("Hello from JNI!"); }查错这段jni代码
这个 JNI 代码的写法是正确的,但需要注意几个问题:
1. 在使用该 JNI 方法时,需要在 Java 类中声明该方法,方法名和参数列表必须与 JNI 方法签名一致。
2. 在 C++ 中使用 JNI 函数时,需要包含 jni.h 头文件,并且使用 "extern C" 包含 JNI 函数,以确保函数名符合 C++ 标准。
3. 在返回字符串时,需要使用 `env->NewStringUTF()` 函数创建一个 Java 字符串对象,该函数接受一个 `const char*` 类型的参数,表示要返回的字符串。
以下是一个完整的 JNI 示例代码:
```c++
#include <jni.h>
#include <string>
extern "C" {
JNIEXPORT jstring JNICALL Java_com_android_pilotxxx_PilotJni_getString(JNIEnv *env, jobject obj) {
return env->NewStringUTF("Hello from JNI!");
}
}
```
在 Java 中使用该 JNI 方法的示例代码:
```java
public class PilotJni {
static {
System.loadLibrary("pilotjni");
}
public native String getString();
}
```
阅读全文