Merge branch 'android_lib'

* android_lib:
  make style
  cmake android: add backslashes for host compatibility
  Translation some comments from Chinese to English.
  Android cmake: use common cmake files for deps
This commit is contained in:
Philippe Teuwen 2020-05-07 12:20:02 +02:00
commit a9964f4f51
4 changed files with 50 additions and 305 deletions

View file

@ -1,15 +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"
add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO) # 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)
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)
# 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
@ -26,52 +31,6 @@ add_library(pm3rrg_rdv4 SHARED
${PM3_ROOT}/common/iso15693tools.c ${PM3_ROOT}/common/iso15693tools.c
${PM3_ROOT}/common/bucketsort.c ${PM3_ROOT}/common/bucketsort.c
${PM3_ROOT}/common/legic_prng.c ${PM3_ROOT}/common/legic_prng.c
${PM3_ROOT}/common/mbedtls/aes.c
${PM3_ROOT}/common/mbedtls/base64.c
${PM3_ROOT}/common/mbedtls/rsa.c
${PM3_ROOT}/common/mbedtls/rsa_internal.c
${PM3_ROOT}/common/mbedtls/arc4.c
${PM3_ROOT}/common/mbedtls/bignum.c
${PM3_ROOT}/common/mbedtls/asn1parse.c
${PM3_ROOT}/common/mbedtls/asn1write.c
${PM3_ROOT}/common/mbedtls/blowfish.c
${PM3_ROOT}/common/mbedtls/camellia.c
${PM3_ROOT}/common/mbedtls/certs.c
${PM3_ROOT}/common/mbedtls/des.c
${PM3_ROOT}/common/mbedtls/ecdsa.c
${PM3_ROOT}/common/mbedtls/ecp.c
${PM3_ROOT}/common/mbedtls/ecp_curves.c
${PM3_ROOT}/common/mbedtls/entropy.c
${PM3_ROOT}/common/mbedtls/entropy_poll.c
${PM3_ROOT}/common/mbedtls/error.c
${PM3_ROOT}/common/mbedtls/md.c
${PM3_ROOT}/common/mbedtls/md5.c
${PM3_ROOT}/common/mbedtls/md_wrap.c
${PM3_ROOT}/common/mbedtls/sha1.c
${PM3_ROOT}/common/mbedtls/sha256.c
${PM3_ROOT}/common/mbedtls/sha512.c
${PM3_ROOT}/common/mbedtls/timing.c
${PM3_ROOT}/common/mbedtls/cmac.c
${PM3_ROOT}/common/mbedtls/oid.c
${PM3_ROOT}/common/mbedtls/pem.c
${PM3_ROOT}/common/mbedtls/pk.c
${PM3_ROOT}/common/mbedtls/pk_wrap.c
${PM3_ROOT}/common/mbedtls/pkcs5.c
${PM3_ROOT}/common/mbedtls/pkcs12.c
${PM3_ROOT}/common/mbedtls/pkparse.c
${PM3_ROOT}/common/mbedtls/pkwrite.c
${PM3_ROOT}/common/mbedtls/x509.c
${PM3_ROOT}/common/mbedtls/x509_crl.c
${PM3_ROOT}/common/mbedtls/x509_crt.c
${PM3_ROOT}/common/mbedtls/ctr_drbg.c
${PM3_ROOT}/common/mbedtls/cipher_wrap.c
${PM3_ROOT}/common/mbedtls/cipher.c
${PM3_ROOT}/common/mbedtls/platform_util.c
${PM3_ROOT}/common//zlib/inflate.c
${PM3_ROOT}/common/zlib/inffast.c
${PM3_ROOT}/common/zlib/zutil.c
${PM3_ROOT}/common/zlib/inftrees.c
${PM3_ROOT}/common//zlib/adler32.c
# client inside # client inside
${PM3_ROOT}/client/src/fileutils.c ${PM3_ROOT}/client/src/fileutils.c
${PM3_ROOT}/client/src/uart/uart_posix.c ${PM3_ROOT}/client/src/uart/uart_posix.c
@ -187,217 +146,26 @@ 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
# deps ouside # android resources
${PM3_ROOT}/client/deps/jansson/utf.c
${PM3_ROOT}/client/deps/jansson/dump.c
${PM3_ROOT}/client/deps/jansson/path.c
${PM3_ROOT}/client/deps/jansson/load.c
${PM3_ROOT}/client/deps/jansson/error.c
${PM3_ROOT}/client/deps/jansson/value.c
${PM3_ROOT}/client/deps/jansson/memory.c
${PM3_ROOT}/client/deps/jansson/pack_unpack.c
${PM3_ROOT}/client/deps/jansson/hashtable_seed.c
${PM3_ROOT}/client/deps/jansson/strbuffer.c
${PM3_ROOT}/client/deps/jansson/strconv.c
${PM3_ROOT}/client/deps/jansson/hashtable.c
${PM3_ROOT}/client/deps/jansson/hashtable.c
# cliparser
${PM3_ROOT}/client/deps/cliparser/cliparser.c
${PM3_ROOT}/client/deps/cliparser/argtable3.c
# tinycbor
${PM3_ROOT}/client/deps/tinycbor/cborencoder.c
${PM3_ROOT}/client/deps/tinycbor/cborencoder_close_container_checked.c
${PM3_ROOT}/client/deps/tinycbor/cborerrorstrings.c
${PM3_ROOT}/client/deps/tinycbor/cborparser.c
${PM3_ROOT}/client/deps/tinycbor/cborparser_dup_string.c
${PM3_ROOT}/client/deps/tinycbor/cborpretty.c
${PM3_ROOT}/client/deps/tinycbor/cborpretty_stdio.c
${PM3_ROOT}/client/deps/tinycbor/cbortojson.c
${PM3_ROOT}/client/deps/tinycbor/cborvalidation.c
${PM3_ROOT}/client/deps/tinycbor/open_memstream.c
# reveng
${PM3_ROOT}/client/deps/reveng/cli.c
${PM3_ROOT}/client/deps/reveng/bmpbit.c
${PM3_ROOT}/client/deps/reveng/preset.c
${PM3_ROOT}/client/deps/reveng/model.c
${PM3_ROOT}/client/deps/reveng/poly.c
${PM3_ROOT}/client/deps/reveng/reveng.c
# liblua
${PM3_ROOT}/client/deps/liblua/lapi.c
${PM3_ROOT}/client/deps/liblua/ldo.c
${PM3_ROOT}/client/deps/liblua/lgc.c
${PM3_ROOT}/client/deps/liblua/ltm.c
${PM3_ROOT}/client/deps/liblua/lvm.c
${PM3_ROOT}/client/deps/liblua/lzio.c
${PM3_ROOT}/client/deps/liblua/lcode.c
${PM3_ROOT}/client/deps/liblua/llex.c
${PM3_ROOT}/client/deps/liblua/liolib.c
${PM3_ROOT}/client/deps/liblua/loslib.c
${PM3_ROOT}/client/deps/liblua/lopcodes.c
${PM3_ROOT}/client/deps/liblua/lmem.c
${PM3_ROOT}/client/deps/liblua/lmathlib.c
${PM3_ROOT}/client/deps/liblua/ldump.c
${PM3_ROOT}/client/deps/liblua/ldblib.c
${PM3_ROOT}/client/deps/liblua/lundump.c
${PM3_ROOT}/client/deps/liblua/lcorolib.c
${PM3_ROOT}/client/deps/liblua/lauxlib.c
${PM3_ROOT}/client/deps/liblua/ltablib.c
${PM3_ROOT}/client/deps/liblua/linit.c
${PM3_ROOT}/client/deps/liblua/lstring.c
${PM3_ROOT}/client/deps/liblua/lctype.c
${PM3_ROOT}/client/deps/liblua/ltable.c
${PM3_ROOT}/client/deps/liblua/ldebug.c
${PM3_ROOT}/client/deps/liblua/lstate.c
${PM3_ROOT}/client/deps/liblua/lstrlib.c
${PM3_ROOT}/client/deps/liblua/lfunc.c
${PM3_ROOT}/client/deps/liblua/lparser.c
${PM3_ROOT}/client/deps/liblua/lobject.c
${PM3_ROOT}/client/deps/liblua/loadlib.c
${PM3_ROOT}/client/deps/liblua/lbaselib.c
${PM3_ROOT}/client/deps/liblua/lbitlib.c
${PM3_ROOT}/client/deps/hardnested/hardnested_bruteforce.c
# 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}/
${PM3_ROOT}/include/ ${PM3_ROOT}/include/
${PM3_ROOT}/common ${PM3_ROOT}/common
${PM3_ROOT}/common/zlib
${PM3_ROOT}/common_fpga ${PM3_ROOT}/common_fpga
${PM3_ROOT}/common/mbedtls ${PM3_ROOT}/client/src)
${PM3_ROOT}/client/src
${PM3_ROOT}/client/src/fido
${PM3_ROOT}/client/src/uart
${PM3_ROOT}/client/deps/liblua
${PM3_ROOT}/client/deps/reveng
${PM3_ROOT}/client/deps/jansson
${PM3_ROOT}/client/deps/tinycbor
${PM3_ROOT}/client/deps/cliparser
${PM3_ROOT}/client/deps/hardnested)
## CPU-specific code find_library(pm3rrg_rdv4_cliparser REQUIRED)
## These are mostly for x86-based architectures, which is not useful for many Android devices. find_library(pm3rrg_rdv4_jansson REQUIRED)
add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT find_library(pm3rrg_rdv4_tinycbor REQUIRED)
${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c find_library(pm3rrg_rdv4_lua REQUIRED)
${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) find_library(pm3rrg_rdv4_mbedtls REQUIRED)
find_library(pm3rrg_rdv4_reveng REQUIRED)
find_library(pm3rrg_rdv4_z REQUIRED)
find_library(pm3rrg_rdv4_hardnested REQUIRED)
target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE 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)
${PM3_ROOT}/common
${PM3_ROOT}/client
${PM3_ROOT}/include/
${PM3_ROOT}/client/deps/hardnested)
set(X86_CPUS x86 x86_64 i686)
message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}")
if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS)
message(STATUS "Building optimised x86/x86_64 binaries")
target_compile_options(pm3rrg_rdv4_hardnested_nosimd BEFORE PRIVATE
-mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f)
set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON)
## x86 / MMX
add_library(pm3rrg_rdv4_hardnested_mmx OBJECT
${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c
${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c)
target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE
-mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f)
target_include_directories(pm3rrg_rdv4_hardnested_mmx PRIVATE
${PM3_ROOT}/common
${PM3_ROOT}/client
${PM3_ROOT}/include/
${PM3_ROOT}/client/deps/hardnested)
set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON)
## x86 / SSE2
add_library(pm3rrg_rdv4_hardnested_sse2 OBJECT
${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c
${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c)
target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE
-mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f)
target_include_directories(pm3rrg_rdv4_hardnested_sse2 PRIVATE
${PM3_ROOT}/common
${PM3_ROOT}/client
${PM3_ROOT}/include/
${PM3_ROOT}/client/deps/hardnested)
set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON)
## x86 / AVX
add_library(pm3rrg_rdv4_hardnested_avx OBJECT
${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c
${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c)
target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE
-mmmx -msse2 -mavx -mno-avx2 -mno-avx512f)
target_include_directories(pm3rrg_rdv4_hardnested_avx PRIVATE
${PM3_ROOT}/common
${PM3_ROOT}/client
${PM3_ROOT}/include/
${PM3_ROOT}/client/deps/hardnested)
set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON)
## x86 / AVX2
add_library(pm3rrg_rdv4_hardnested_avx2 OBJECT
${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c
${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c)
target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE
-mmmx -msse2 -mavx -mavx2 -mno-avx512f)
target_include_directories(pm3rrg_rdv4_hardnested_avx2 PRIVATE
${PM3_ROOT}/common
${PM3_ROOT}/client
${PM3_ROOT}/include/
${PM3_ROOT}/client/deps/hardnested)
set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON)
## x86 / AVX512
add_library(pm3rrg_rdv4_hardnested_avx512 OBJECT
${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c
${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c)
target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE
-mmmx -msse2 -mavx -mavx2 -mavx512f)
target_include_directories(pm3rrg_rdv4_hardnested_avx512 PRIVATE
${PM3_ROOT}/common
${PM3_ROOT}/client
${PM3_ROOT}/include/
${PM3_ROOT}/client/deps/hardnested)
set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON)
set(SIMD_TARGETS
$<TARGET_OBJECTS:pm3rrg_rdv4_hardnested_mmx>
$<TARGET_OBJECTS:pm3rrg_rdv4_hardnested_sse2>
$<TARGET_OBJECTS:pm3rrg_rdv4_hardnested_avx>
$<TARGET_OBJECTS:pm3rrg_rdv4_hardnested_avx2>
$<TARGET_OBJECTS:pm3rrg_rdv4_hardnested_avx512>)
else ()
message(STATUS "Not building optimised targets")
set(SIMD_TARGETS)
endif ()
#定义为静态库被最终的pm3库依赖!
add_library(pm3rrg_rdv4_hardnested STATIC
$<TARGET_OBJECTS:pm3rrg_rdv4_hardnested_nosimd>
${SIMD_TARGETS})
#添加动态库链接!
target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested android log z)

View file

@ -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);
} }

View file

@ -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

View file

@ -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();
@ -136,10 +126,16 @@ jboolean testPm3(JNIEnv *env, jobject instance) {
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) {