java - 更新 JNI 中的 jint 变量

标签 java android c++ java-native-interface

当调用下面的 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/

相关文章:

Java TreeMap containsKey 总是返回 true?

java - 如何访问 JavaFx 2.0 中的 Controller 类?

Android - 定期更新 TextView

Android 登录替代方案

java - 在 begin 和 end 参数之间打印文件的内容

Java 计算 IF 语句

android - 不同设备上的印地语字符 View 不同

c++ - 在 C++ 中修剪 double 值

c++ - 编译器为函数指定 always_inline

C++ 静态变量声明奇怪的链接器错误