mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
Translation some comments from Chinese to English.
This commit is contained in:
parent
59453aea8b
commit
e8999f3318
4 changed files with 48 additions and 70 deletions
|
@ -1,17 +1,20 @@
|
||||||
#需要的最cmake版本
|
# version
|
||||||
cmake_minimum_required(VERSION 3.4.1)
|
cmake_minimum_required(VERSION 3.4.1)
|
||||||
|
|
||||||
#添加预编译宏定义参数,此次的作用是开启配置文件的引入!
|
# We are build on android platform, so we need add def "ANDROID"
|
||||||
|
# NDK version for SDK 19 doesn't implement the whole C++11 standard in the STL.
|
||||||
|
# see: https://stackoverflow.com/questions/44736135/ndk-clang-error-undefined-reference-to-localeconv
|
||||||
|
# so we need add def getlocaledecpoint()='.'
|
||||||
add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO)
|
add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO)
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w")
|
||||||
|
|
||||||
#缩短路径定义
|
# Root path into client
|
||||||
set(PM3_ROOT ../../)
|
set(PM3_ROOT ../../)
|
||||||
|
|
||||||
add_subdirectory(../deps deps)
|
add_subdirectory(../deps deps)
|
||||||
|
|
||||||
#添加动态库定义
|
# client resources
|
||||||
add_library(pm3rrg_rdv4 SHARED
|
add_library(pm3rrg_rdv4 SHARED
|
||||||
${PM3_ROOT}/common/util_posix.c
|
${PM3_ROOT}/common/util_posix.c
|
||||||
${PM3_ROOT}/common/crapto1/crapto1.c
|
${PM3_ROOT}/common/crapto1/crapto1.c
|
||||||
|
@ -143,13 +146,12 @@ add_library(pm3rrg_rdv4 SHARED
|
||||||
${PM3_ROOT}/client/src/cmdlfpcf7931.c
|
${PM3_ROOT}/client/src/cmdlfpcf7931.c
|
||||||
${PM3_ROOT}/client/src/cmdhfmfhard.c
|
${PM3_ROOT}/client/src/cmdhfmfhard.c
|
||||||
${PM3_ROOT}/client/src/cmdusart.c
|
${PM3_ROOT}/client/src/cmdusart.c
|
||||||
|
# android resources
|
||||||
# android source
|
|
||||||
jni_tools.c
|
jni_tools.c
|
||||||
pm3_main.c
|
pm3_main.c
|
||||||
)
|
)
|
||||||
|
|
||||||
#添加头文件配置
|
# includes
|
||||||
target_include_directories(pm3rrg_rdv4 PRIVATE
|
target_include_directories(pm3rrg_rdv4 PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${PM3_ROOT}/include/
|
${PM3_ROOT}/include/
|
||||||
|
@ -166,5 +168,4 @@ find_library(pm3rrg_rdv4_reveng REQUIRED)
|
||||||
find_library(pm3rrg_rdv4_z REQUIRED)
|
find_library(pm3rrg_rdv4_z REQUIRED)
|
||||||
find_library(pm3rrg_rdv4_hardnested REQUIRED)
|
find_library(pm3rrg_rdv4_hardnested REQUIRED)
|
||||||
|
|
||||||
target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z android log)
|
target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested pm3rrg_rdv4_mbedtls pm3rrg_rdv4_cliparser pm3rrg_rdv4_jansson pm3rrg_rdv4_lua pm3rrg_rdv4_tinycbor pm3rrg_rdv4_amiibo pm3rrg_rdv4_reveng pm3rrg_rdv4_z android log)
|
||||||
#添加动态库链接!
|
|
|
@ -7,10 +7,10 @@
|
||||||
#include <jni_tools.h>
|
#include <jni_tools.h>
|
||||||
#include "stdbool.h"
|
#include "stdbool.h"
|
||||||
|
|
||||||
//当前线程是否添加的标志位
|
// native thread attach label
|
||||||
static bool g_IsAttach;
|
static bool g_IsAttach;
|
||||||
|
|
||||||
//TODO 环境变量获取函数
|
// get current env for jvm
|
||||||
JNIEnv *getJniEnv() {
|
JNIEnv *getJniEnv() {
|
||||||
JNIEnv *currentThreadEnv;
|
JNIEnv *currentThreadEnv;
|
||||||
g_IsAttach = false;
|
g_IsAttach = false;
|
||||||
|
@ -32,66 +32,47 @@ JNIEnv *getJniEnv() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//解绑线程env
|
// detach native thread from jvm
|
||||||
void deatchThread() {
|
void detachThread() {
|
||||||
if (g_IsAttach) {
|
if (g_IsAttach) {
|
||||||
LOGD("线程解绑成功!");
|
|
||||||
(*g_JavaVM)->DetachCurrentThread(g_JavaVM);
|
(*g_JavaVM)->DetachCurrentThread(g_JavaVM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO 命令行解析
|
// cmd arg parse
|
||||||
CMD *parse_command_line(const char *commandStr) {
|
CMD *parse_command_line(const char *commandStr) {
|
||||||
//一个指针,指向传进来的命令字符串(const修饰的,我们需要复刻一份!)
|
|
||||||
CMD *cmd = (CMD *) malloc(sizeof(CMD));
|
CMD *cmd = (CMD *) malloc(sizeof(CMD));
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
LOGD("申请空间失败!");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
//拷贝字符串到堆空间!
|
// copy the source to the heap
|
||||||
char *pTmp = strdup(commandStr);
|
char *pTmp = strdup(commandStr);
|
||||||
LOGD("拷贝参数字符串到临时堆!");
|
// new memory size is default 20 for char **
|
||||||
//返回的结果!先初始化为20个空间
|
|
||||||
int size = 20;
|
int size = 20;
|
||||||
cmd->cmd = (char **) malloc(size * sizeof(char **));
|
cmd->cmd = (char **) malloc(size * sizeof(char **));
|
||||||
if (cmd->cmd) {
|
if (!cmd->cmd) return NULL;
|
||||||
LOGD("申请参数空间成功!");
|
// parse
|
||||||
} else {
|
|
||||||
LOGD("申请空间失败!");
|
|
||||||
}
|
|
||||||
//进行截取
|
|
||||||
char *pStr = strtok(pTmp, " ");
|
char *pStr = strtok(pTmp, " ");
|
||||||
LOGD("第0次截取完成: %s", pStr);
|
|
||||||
//给结果数组进行下标为0的第一次初始化
|
|
||||||
cmd->cmd[0] = pStr;
|
cmd->cmd[0] = pStr;
|
||||||
//局部变量用于储存解析到的命令个数,下标移动为一
|
|
||||||
int count = 1;
|
int count = 1;
|
||||||
//需要截取命令参数,以空格为限定符
|
|
||||||
for (; pStr != NULL; ++count) {
|
for (; pStr != NULL; ++count) {
|
||||||
//如果容量不够,则扩容!
|
// Capacity expansion
|
||||||
if (count == (size - 1)) {
|
if (count == (size - 1)) {
|
||||||
size += 20;
|
size += 20;
|
||||||
cmd->cmd = (char **) realloc(cmd->cmd, size * sizeof(char **));
|
cmd->cmd = (char **) realloc(cmd->cmd, size * sizeof(char **));
|
||||||
LOGD("超过初始容量,自动扩容!");
|
|
||||||
}
|
}
|
||||||
pStr = strtok(NULL, " ");
|
pStr = strtok(NULL, " ");
|
||||||
if (pStr) {
|
if (pStr) {
|
||||||
cmd->cmd[count] = pStr;
|
cmd->cmd[count] = pStr;
|
||||||
LOGD("第%d次截取完成: %s", count, pStr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmd->len = (count - 1);
|
cmd->len = (count - 1);
|
||||||
LOGD("解析函数执行完成!");
|
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
//内存释放
|
// cmd arg struct free
|
||||||
void free_command_line(CMD *cmd) {
|
void free_command_line(CMD *cmd) {
|
||||||
//二级指针需要逐层释放!
|
|
||||||
LOGD("释放命令行字符串二级引用!");
|
|
||||||
free(cmd->cmd[0]);
|
free(cmd->cmd[0]);
|
||||||
LOGD("释放命令行一级引用!");
|
|
||||||
free(cmd->cmd);
|
free(cmd->cmd);
|
||||||
LOGD("释放结构体内存");
|
|
||||||
free(cmd);
|
free(cmd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,31 +10,31 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
//JNI LOG
|
//JNI LOG
|
||||||
#define TAG "DXL BlUESPP_PN532"
|
#define TAG "PM3"
|
||||||
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__)
|
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__)
|
||||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
|
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
|
||||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
|
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
|
||||||
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__)
|
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__)
|
||||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)
|
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)
|
||||||
|
|
||||||
//全局的环境变量定义
|
// a global jvm instance
|
||||||
JavaVM *g_JavaVM;
|
JavaVM *g_JavaVM;
|
||||||
|
|
||||||
//线程环境指针获取函数
|
// get current env for jvm
|
||||||
JNIEnv *getJniEnv();
|
JNIEnv *getJniEnv();
|
||||||
|
|
||||||
//子线程释放函数,必须是native层创建的线程才可以调用
|
// detach native thread from jvm, must native thread can detach!
|
||||||
void deatchThread();
|
void detachThread();
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char **cmd;
|
char **cmd;
|
||||||
int len;
|
int len;
|
||||||
} CMD;
|
} CMD;
|
||||||
|
|
||||||
//命令行解析函数
|
// cmd arg parse
|
||||||
CMD *parse_command_line(const char *commandStr);
|
CMD *parse_command_line(const char *commandStr);
|
||||||
|
|
||||||
//解析结果释放函数!
|
// cmd arg struct free
|
||||||
void free_command_line(CMD *);
|
void free_command_line(CMD *);
|
||||||
|
|
||||||
#endif //DXL_TOOLS_H
|
#endif //DXL_TOOLS_H
|
||||||
|
|
|
@ -79,7 +79,7 @@ static bool open() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 发送一条命令等待执行!
|
* Transfers to the command buffer and waits for a new command to be executed
|
||||||
* */
|
* */
|
||||||
jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) {
|
jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) {
|
||||||
//may be pm3 not running.
|
//may be pm3 not running.
|
||||||
|
@ -93,19 +93,9 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) {
|
||||||
CloseProxmark();
|
CloseProxmark();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//无论如何,新的命令的输入了,就要换个行!
|
// display on new line
|
||||||
PrintAndLogEx(NORMAL, "\n");
|
PrintAndLogEx(NORMAL, "\n");
|
||||||
char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0));
|
char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0));
|
||||||
// Many parts of the PM3 client will assume that they can read any write from pwd. So we set
|
|
||||||
// pwd to whatever the PM3 "executable directory" is, to get consistent behaviour.
|
|
||||||
/*int ret = chdir(get_my_executable_directory());
|
|
||||||
if (ret == -1) {
|
|
||||||
LOGW("Couldn't chdir(get_my_executable_directory()), errno=%s", strerror(errno));
|
|
||||||
}
|
|
||||||
char pwd[1024];
|
|
||||||
memset((void *) &pwd, 0, sizeof(pwd));
|
|
||||||
getcwd((char *) &pwd, sizeof(pwd));
|
|
||||||
LOGI("pwd = %s", pwd);*/
|
|
||||||
int ret = CommandReceived(cmd);
|
int ret = CommandReceived(cmd);
|
||||||
if (ret == 99) {
|
if (ret == 99) {
|
||||||
// exit / quit
|
// exit / quit
|
||||||
|
@ -117,14 +107,14 @@ jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 是否在执行命令
|
* Is client running!
|
||||||
* */
|
* */
|
||||||
jboolean isExecuting(JNIEnv *env, jobject instance) {
|
jboolean isExecuting(JNIEnv *env, jobject instance) {
|
||||||
return (jboolean)((jboolean) conn.run);
|
return (jboolean) ((jboolean) conn.run);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 进行设备链接验证!
|
* test hw and hw and client.
|
||||||
* */
|
* */
|
||||||
jboolean testPm3(JNIEnv *env, jobject instance) {
|
jboolean testPm3(JNIEnv *env, jobject instance) {
|
||||||
bool ret1 = open();
|
bool ret1 = open();
|
||||||
|
@ -133,13 +123,19 @@ jboolean testPm3(JNIEnv *env, jobject instance) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool ret2 = TestProxmark() == PM3_SUCCESS;
|
bool ret2 = TestProxmark() == PM3_SUCCESS;
|
||||||
return (jboolean)(ret1 && ret2);
|
return (jboolean) (ret1 && ret2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* stop pm3 client
|
||||||
|
* */
|
||||||
void stopPm3(JNIEnv *env, jobject instance) {
|
void stopPm3(JNIEnv *env, jobject instance) {
|
||||||
CloseProxmark();
|
CloseProxmark();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* native function map to jvm
|
||||||
|
* */
|
||||||
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||||
JNIEnv *jniEnv = NULL;
|
JNIEnv *jniEnv = NULL;
|
||||||
if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) {
|
if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) {
|
||||||
|
@ -152,21 +148,21 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||||
}
|
}
|
||||||
jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4");
|
jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4");
|
||||||
JNINativeMethod methods[] = {
|
JNINativeMethod methods[] = {
|
||||||
{"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD},
|
{"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD},
|
||||||
{"stopExecute", "()V", (void *) stopPm3},
|
{"stopExecute", "()V", (void *) stopPm3},
|
||||||
{"isExecuting", "()Z", (void *) isExecuting}
|
{"isExecuting", "()Z", (void *) isExecuting}
|
||||||
};
|
};
|
||||||
JNINativeMethod methods1[] = {
|
JNINativeMethod methods1[] = {
|
||||||
{"testPm3", "()Z", (void *) testPm3},
|
{"testPm3", "()Z", (void *) testPm3},
|
||||||
{"closePm3", "()V", stopPm3}
|
{"closePm3", "()V", stopPm3}
|
||||||
};
|
};
|
||||||
if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) !=
|
if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) !=
|
||||||
JNI_OK) {
|
JNI_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1,
|
if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1,
|
||||||
sizeof(methods1) / sizeof(methods1[0])) !=
|
sizeof(methods1) / sizeof(methods1[0])) !=
|
||||||
JNI_OK) {
|
JNI_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
(*jniEnv)->DeleteLocalRef(jniEnv, clazz);
|
(*jniEnv)->DeleteLocalRef(jniEnv, clazz);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue