从jni

时间:2016-10-24 16:11:00

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

我想从JNI访问java函数(收发)。不幸的是,我收到消息错误,当从IsoDep.java调用收发功能时,app已停止

如何以参数形式调用收发函数并以字节数组的形式输出?

请帮帮我,谢谢。

JMain.java

Class JMain {
    static {
        System.loadLibrary("Native");
    }

    public native byte[] ReadData();
}

IsoDep.java

public byte[] transceive(byte[] data) throws IOException {
    //
}

Native.cpp

#include <jni.h>
#include <iostream>

#ifdef __cplusplus
    extern "C" {
#endif

JNIEnv *JNI_GetEnv() {
   //
}

JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *jvm, void *reserved) {
     //
}


jbyteArray SendReq(jobject isoDep, jbyteArray b) {
    // PROBLEM IN HERE..
    //   Error unfortunately, app has stopped when call transceive function
    //   from IsoDep.java
    jbyte *args = e->GetByteArrayElements(b, NULL); 
    return (jbyteArray) e->CallObjectMethodA(isoDep, _midTransceive, (jvalue *) args);  
}

JNIEXPORT jbyteArray JNICALL
Java_com_company_appname_JMain_ReadData(JNIEnv *env, jobject obj) {
    //
}

#ifdef __cplusplus
    }
#endif

1 个答案:

答案 0 :(得分:0)

您的transceive方法需要Java字节数组引用(jbyteArray / jobject)作为参数,而不是C ++ jbyte指针(jbyte*)。

当您使用GetByteArrayElements对字节数组的内容进行extraxt时,您会得到一些只能在本机代码中使用的东西而不是有效的Java引用(并且将该非引用传递给Java方法是什么让你的程序崩溃)。省略该步骤并直接传递b