IT虾米网

java之更新 JNI 中的 jint 变量

sxdcgaq8080 2025年05月04日 程序员 25 0

当调用下面的 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 方法调用和方法签名的更多信息.


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!