gpt4 book ai didi

java - 更新 JNI 中的 jint 变量

转载 作者:行者123 更新时间:2023-12-03 12:49:07 25 4
gpt4 key购买 nike

当调用下面的 JNI 函数时,调用该函数的应用程序 (Android/java) 可以正确接收 dataByteArray(jbyteArray 类型)。但应用程序未收到 sizeDataByteArray(jint 类型)。请让我知道下面的代码有什么问题。

JNIEXPORT jboolean JNICALL Java_com_example_helloworld_Tester_getData
(JNIEnv* env, jclass clasz, jbyteArray dataByteArray, jint sizeDataByteArray) {

// Some code
l_data = “01:02:03:AB:CD:EF”;
l_data_size = strlen(l_data);
env->SetByteArrayRegion(dataByteArray, 0, strlen(l_data), (jbyte *) l_data);
sizeDataByteArray = l_data_size;

// Some code
return true;
}

最佳答案

您可以创建类以从 native 代码返回多个值:

public class ReturnValue {
public final boolean success;
public final byte[] result;

public ReturnValue(boolean success, byte[] result) {
this.success = success;
this.result = result;
}
}

从jni返回这个对象,你可以这样实现:

JNIEXPORT jobject JNICALL Java_com_example_helloworld_Tester_getData
(JNIEnv* env, jclass clasz, jbyteArray dataByteArray, jint sizeDataByteArray) {
const char* cls_name = "com/example/helloworld/ReturnValue";
// try to obtain ReturnValue class
jclass cls = env->FindClass(cls_name);
// if exception occurred return control to java
if (env->ExceptionOccurred())
return NULL;

const char* constructor_signature = "(Z[B)V";
// try to obtain ReturnValue constructor
jmethodID constructorId = env->GetMethodID(cls, "<init>", constructor_signature);
// if exception occurred return control to java
if (env->ExceptionOccurred())
return NULL;

jboolean success = true;
jbyteArray data = env->NewByteArray(0);

// fill data array...

// create ReturnValue object. If exception occurred,
// control will be returned java automatically in this case
return env->NewObject(cls, constructorId, success, data);
}

阅读 this article 中有关 jni 方法调用和方法签名的更多信息.

关于java - 更新 JNI 中的 jint 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47447331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com