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