add bridge native code

This commit is contained in:
nganhkhoa 2023-03-01 10:52:33 +07:00
parent 6446d18ee1
commit 5fb8af9d4f

View File

@ -0,0 +1,60 @@
#include <jni.h>
#include <string>
#include <android/log.h>
#include "consts.h"
#include "api.h"
std::unique_ptr<Connector> connector = nullptr;
void setup(JNIEnv* env, jobject isoDepObj);
void initSessionViaBAC();
extern "C" JNIEXPORT jint JNICALL
Java_com_bshield_cccc_MainActivity_initNFCScan(
JNIEnv* env,
jobject /* this */,
jobject isoDepObj) {
setup(env, isoDepObj);
if (!connector) return 0;
connector->selectDf1();
connector->initBAC();
connector->readEFCOM();
return 1;
}
void setup(JNIEnv* env, jobject isoDepObj) {
// Get the IsoDep class and its methods
jclass isoDepClass = env->FindClass("android/nfc/tech/IsoDep");
jmethodID connectMethod = env->GetMethodID(isoDepClass, "connect", "()V");
jmethodID closeMethod = env->GetMethodID(isoDepClass, "close", "()V");
jmethodID transceiveMethod = env->GetMethodID(isoDepClass, "transceive", "([B)[B");
jmethodID isConnectedMethod = env->GetMethodID(isoDepClass, "isConnected", "()Z");
// formalize api to vector<uint8_t> to remove platform dependency
// use closure to capture values to work on transceive api easily
auto transceive = [env, isoDepObj, transceiveMethod](std::vector<uint8_t> data) {
jbyteArray command = env->NewByteArray(data.size());
env->SetByteArrayRegion(command, 0, data.size(), reinterpret_cast<const jbyte*>(data.data()));
auto b = (jbyteArray)env->CallObjectMethod(isoDepObj, transceiveMethod, command);
jsize length = env->GetArrayLength(b);
jbyte* elements = env->GetByteArrayElements(b, NULL);
std::vector<uint8_t> vec(length);
memcpy(&vec[0], elements, length);
env->ReleaseByteArrayElements(b, elements, JNI_ABORT);
return vec;
};
connector.reset(new Connector(transceive));
// cannot remove, must call connect to connect
env->CallVoidMethod(isoDepObj, connectMethod);
// jboolean isConnected = env->CallBooleanMethod(isoDepObj, isConnectedMethod);
return;
};