2016-10-24 8 views
0

JNIからJava関数(トランシーバ)にアクセスしたいとします。残念ながら、メッセージエラーが発生しました。アプリケーションはIsoDep.javaからトランシーバ関数を呼び出すと停止しました。jniからjava関数を呼び出す際にエラーが発生しました

パラメータとバイト配列の形で出力する際に​​、どのように送受信機能を呼び出すのですか?

よろしくお願いいたします。

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 
+0

エラーのスタックトレースを編集して追加します。 – MordechayS

+0

別の質問:パラメータとして 'env'を取得したときに' JNI_GetEnv() 'メソッドを呼び出すのはなぜですか? – user2543253

+0

@ user2543253、キャッシュされたJavaVMインタフェースポインタを指定すると、ネイティブコードが現在のスレッドのJNIEnvインタフェースポインタを取得できるようにするユーティリティ関数を実装するのは簡単です。 –

答えて

0

あなたtransceive方法は、などのJavaバイト配列の参照(jbyteArray/jobjectを)望んでいますパラメータではなく、C++のjbyteポインタ(jbyte*)。

GetByteArrayElementsでバイト配列の内容を拡張すると、有効なJava参照ではなく、ネイティブコードでのみ使用できるものが得られます(Javaメソッドへの非参照はプログラムがクラッシュする原因になります)。そのステップを省略してbを直接渡してください。

+0

このコードは私の問題を解決しましたreturn(jbyteArray)e-> CallObjectMethod(isoDep、_midTransceive、(jvalue *)b); –

関連する問題