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
エラーのスタックトレースを編集して追加します。 – MordechayS
別の質問:パラメータとして 'env'を取得したときに' JNI_GetEnv() 'メソッドを呼び出すのはなぜですか? – user2543253
@ user2543253、キャッシュされたJavaVMインタフェースポインタを指定すると、ネイティブコードが現在のスレッドのJNIEnvインタフェースポインタを取得できるようにするユーティリティ関数を実装するのは簡単です。 –