yy1717
2022-12-08 f7a18ec4494b9c5c9ef3fd440bbf68ffc6425e18
lib/src/main/cpp/native-lib.cpp
@@ -1,6 +1,6 @@
#include <jni.h>
#include <string>
#include <pthread.h>
#include <mutex>
#include <unistd.h>
#include <cstdlib>
#include <map>
@@ -18,22 +18,26 @@
#include "master/comm_if.h"
#include "rtk_module/virtual_rtk.h"
#include "defs.h"
#include "mcu/ada.h"
#include "mcu/ahp.h"
#define DEBUG(fmt, args...)     LOGD("<native-lib> <%s>: " fmt, __func__, ##args)
#define LIBENC_ARRAY_ELEMS(a)  (sizeof(a) / sizeof(a[0]))
static JavaVM *sg_jvm = NULL;
static jobject sg_obj = NULL;
static JNIEnv *jenv;
const char *RTK_PLATFORM_IP = "47.93.80.84";
const int RTK_PLATFORM_PORT = 12125;
const uint8_t phone[] = {0x20,0x19,0x10,0x15,0x00,0x00,0x00,0x01};
const char *VIRTUAL_RTK_IP = "192.168.43.76";
const char *VIRTUAL_RTK_IP = "192.168.16.212";
const int VIRTUAL_RTK_PORT = 9002;
static pthread_mutex_t tts_mutex = PTHREAD_MUTEX_INITIALIZER;
static int ttsSeq = 1;
static std::mutex tts_mutex;
static std::map<int, void (*)(int)> TTSCallBack;
@@ -206,12 +210,10 @@
static int GetTtsSeq(void)
{
    int seq = 0;
    static int seq = 0;
    pthread_mutex_lock(&tts_mutex);
    seq = ttsSeq++;
    pthread_mutex_unlock(&tts_mutex);
    lock_guard<std::mutex> lock(tts_mutex);
    seq++;
    return seq;
}
@@ -414,35 +416,30 @@
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_startNative(JNIEnv *env, jobject thiz, jboolean ayDevice) {
static void startNative(JNIEnv *env, jobject thiz, jboolean ayDevice) {
    // TODO: implement startNative()
    // 保存全局JVM以便在子线程中使用
    DEBUG("启动Native");
    env->GetJavaVM(&sg_jvm);
    // 不能直接赋值(g_obj = ojb)
    sg_obj = env->NewGlobalRef(thiz);
    srand(time(NULL));
    AppTimer_Init();
    ConfigMCU(ayDevice);
    AppTimer_init();
    ///////////////ConfigMCU(ayDevice);
    InitAda();
    InitAhp();
    DriverTestInit();
    ConfigRTKModule(ayDevice);
    MA_Init();
    InitPlatform(ayDevice, phone, RTK_PLATFORM_IP, RTK_PLATFORM_PORT);
    InitVirtualDevice(VIRTUAL_RTK_IP, VIRTUAL_RTK_PORT);
    pthread_mutex_init(&tts_mutex, NULL);
    MA_NdkStart();
//    MA_NdkStart();
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_MainProcMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
static void MainProcMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
                                                       jstring value) {
    // TODO: implement MainProcMsgEntry()
    union {
@@ -474,9 +471,7 @@
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_MainProcBinMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
void MainProcBinMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
                                                          jbyteArray data, jint length) {
    // TODO: implement MainProcBinMsgEntry()
    jbyte *c_dat = env->GetByteArrayElements(data, NULL);
@@ -487,11 +482,8 @@
    env->ReleaseByteArrayElements(data, c_dat, NULL);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_TextSpeakEnd(JNIEnv *env, jobject thiz, jint id) {
void TextSpeakEnd(JNIEnv *env, jobject thiz, jint id) {
    // TODO: implement TextSpeakEnd()
    auto it = TTSCallBack.find(id);
    if (it != TTSCallBack.end()) {
@@ -506,9 +498,7 @@
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_UpgradeMcu(JNIEnv *env, jobject thiz, jstring vercode,
void UpgradeMcu(JNIEnv *env, jobject thiz, jstring vercode,
                                                 jbyteArray rom) {
    // TODO: implement UpgradeMcu()
    if (vercode != NULL && rom != NULL) {
@@ -523,9 +513,7 @@
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_BluetoothDataComeIn(JNIEnv *env, jobject thiz,
void BluetoothDataComeIn(JNIEnv *env, jobject thiz,
                                                          jbyteArray data, jint length) {
    // TODO: implement BluetoothDataComeIn()
    jbyte *c_dat = env->GetByteArrayElements(data, NULL);
@@ -535,9 +523,8 @@
    env->ReleaseByteArrayElements(data, c_dat, NULL);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_BluetoothStatusChange(JNIEnv *env, jobject thiz,
void BluetoothStatusChange(JNIEnv *env, jobject thiz,
                                                            jint status) {
    // TODO: implement BluetoothStatusChange()
    uint8_t  sta = status;
@@ -545,9 +532,7 @@
    PlatformStatusChanged(BLUETOOTH_STATUS_EVT, &sta, 1);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_anyun_exam_lib_RemoteService_BluetoothConnected(JNIEnv *env, jobject thiz, jstring name,
void BluetoothConnected(JNIEnv *env, jobject thiz, jstring name,
                                                         jstring addr) {
    // TODO: implement BluetoothConnected()
    if (name != NULL && addr != NULL) {
@@ -576,3 +561,59 @@
        PlatformStatusChanged(BLUETOOTH_STATUS_EVT, &sta, 1);
    }
}
static JNINativeMethod methods[] = {
        {"startNative", "(Z)V", reinterpret_cast<void *>(startNative)},
        {"MainProcMsgEntry", "(ILjava/lang/String;)V", reinterpret_cast<void *>(MainProcMsgEntry)},
        {"MainProcBinMsgEntry", "(I[BI)V", reinterpret_cast<void *>(MainProcBinMsgEntry)},
        {"UpgradeMcu", "(Ljava/lang/String;[B)V", reinterpret_cast<void *>(UpgradeMcu)},
        {"TextSpeakEnd", "(I)V", reinterpret_cast<void *>(TextSpeakEnd)},
        {"BluetoothConnected", "(Ljava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(BluetoothConnected)},
        {"BluetoothStatusChange", "(I)V", reinterpret_cast<void *>(BluetoothStatusChange)},
        {"BluetoothDataComeIn", "([BI)V", reinterpret_cast<void *>(BluetoothDataComeIn)}
};
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    sg_jvm = vm;
    if (sg_jvm->GetEnv(reinterpret_cast<void **> (&jenv), JNI_VERSION_1_6) != JNI_OK) {
        DEBUG("Env not got");
        return JNI_ERR;
    }
    jclass clz = jenv->FindClass("com/anyun/exam/lib/RemoteService");
    if (clz == NULL) {
        DEBUG("目标类未找到");
        return JNI_ERR;
    }
    if (jenv->RegisterNatives(clz, methods, LIBENC_ARRAY_ELEMS(methods))) {
        DEBUG("methods not registered");
        return JNI_ERR;
    }
    DEBUG("JNI_OnLoad");
    return JNI_VERSION_1_6;
}
void JNI_OnUnload(JavaVM* vm, void* reserved)
{
    JNIEnv* env;
    if (vm->GetEnv(reinterpret_cast<void **> (&env), JNI_VERSION_1_6) != JNI_OK) {
        DEBUG("Env not got");
        return;
    }
    jclass clz = env->FindClass("com/anyun/exam/lib/RemoteService");
    if (clz == NULL) {
        DEBUG("目标类未找到");
        return;
    }
    env->UnregisterNatives(clz);
    DEBUG("JNI_OnUnload");
}