add bridge native code
This commit is contained in:
parent
6446d18ee1
commit
5fb8af9d4f
60
app/src/main/cpp/native-lib.cpp
Normal file
60
app/src/main/cpp/native-lib.cpp
Normal 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;
|
||||
};
|
Loading…
Reference in New Issue
Block a user