android jni

本文详细介绍了如何使用Java Native Interface (JNI)与RFID设备进行交互,包括本地方法声明、本地库加载、本地方法实现及接口回调处理。具体涵盖了RFID查询、扫描启动、实时数据获取等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、本地方法声明

private native void RFIDRows();

private native void RFIDQueryYY();

private native void RFIDQueryXX();

private native void StartRFIDScan();

private native void GetRFIDResult();

private native void LightRFIDLED(int id, int location, int[][] ints, int len);

private native void SetLight(int y, int brightness,int R,int G,int B);

private native void SetLightAll(int brightness,int R,int G,int B);

private native void DoorStatus(int status);

private native void RealTimeData();

private native void thread();

2、加载本地库

static {
    System.loadLibrary("uart_rfid");
}

3(1)编译jni 通过javah命令生成jni层代码。

D:\Android\WorkSpace\MyRFIDJniDemo\app\src\main\java>javah -jni rfid.Rfid

3(2)编译生成so库

D:\Android\WorkSpace\MyRFIDJniDemo\app>ndk-build

4、c完成本地方法实现

5、

/*
 * 为某一个类注册本地方法
 */
static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods) {

    jclass clazz;

    __android_log_print(ANDROID_LOG_INFO, TAG, "Registering %s natives\n", className);
    clazz = env->FindClass(className);
    if (clazz == NULL) {
        __android_log_print(ANDROID_LOG_ERROR, TAG, "Native registration unable to find class '%s'\n", className);
        return -1;
    }
    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
        __android_log_print(ANDROID_LOG_ERROR, TAG, "RegisterNatives failed for '%s'\n", className);
        return -1;
    }
    return 0;
}

/*
 * 为所有类注册本地方法
 */
static int registerNatives(JNIEnv* env) {
    const char* kClassName = "rfid/Rfid"; //指定要注册的类
    return registerNativeMethods(env, kClassName, gMethods,sizeof(gMethods) / sizeof(gMethods[0]));
}

static JNINativeMethod gMethods[] = {
        {"RFIDQueryYY",          "()V",                 (void *)Java_rfid_Rfid_RFIDQueryYY},
        {"thread",               "()V",                 (void *)Java_rfid_Rfid_thread},
        {"RealTimeData",         "()V",                 (void *)Java_rfid_Rfid_RealTimeData},
        {"RFIDQueryXX",         "()V",               (void *)Java_rfid_Rfid_RFIDQueryXX},
        {"StartRFIDScan",       "()V",               (void *)Java_rfid_Rfid_StartRFIDScan},
        {"GetRFIDResult",        "()V",                 (void *)Java_rfid_Rfid_GetRFIDResult},
        {"DoorStatus",           "(I)V",                (void *)Java_rfid_Rfid_DoorStatus},
        {"SetLight",             "(IIIII)V",            (void *)Java_rfid_Rfid_SetLight},
        {"SetLightAll",          "(IIII)V",             (void *)Java_rfid_Rfid_SetLightAll},
        {"LightRFIDLED",         "(II[[II)V",           (void *)Java_rfid_Rfid_LightRFIDLED},
        {"RFIDRows",             "()V",                 (void *)Java_rfid_Rfid_RFIDRows}
};

6、接口回调

JNIEXPORT void JNICALL Java_rfid_Rfid_RealTimeData(JNIEnv *env,jobject job){
    int i = 0;
    while(serialPortRead(env, job,0,-1) == -1){
        if(i++>NUM){
            break;
        }
        setConfig();
        sleep(1);
    }
    if(i>NUM){
        i = 0;
        //串口异常回调给应用层
        jclass cls=env->GetObjectClass(job);

        jmethodID funid = env->GetMethodID(cls,"Error","()V");//获取本地方法id

        env->CallVoidMethod(job,funid);//调用java文件中的Callback函数,执行此方法
        env->DeleteLocalRef(cls);
    }
  }

回调方法处理:

private void Error(){
    //结果从子线程返回给主线程
    Message tMsg = new Message();
    tMsg.what = 4;
    handler.sendMessage(tMsg);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值