实现android JNI 直接调用android驱动程序
16lz
2021-01-24
觉得蛮好玩的,就转载来,NDK的开发方式比较适合这种方式
原文地址http://blog.csdn.net/zfzf294990051/article/details/7343468
关于如何实现JNI请参考Android JNI实现步骤
本例想测试一下,绕过硬件抽象层,直接在JNI中调用linux驱动程序。JNI的库有java应用程序加载,也就是本例直接是java应用程序通过JNI调用C程序,再通过C程序直接调用linux驱动程序。
[cpp] view plain copy
- #include"com_zhang_jni_test_JNITESTActivity.h"
- #include<utils/Log.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<fcntl.h>
- #defineLOG_TAG"JNI_C"
- #defineDEVICE_NAME"/dev/hello"
- intcallDriver();
- /*
- *Class:com_zhang_jni_test_JNITESTActivity
- *Method:nativeMethod
- *Signature:()V
- */
- JNIEXPORTvoidJNICALLJava_com_zhang_jni_test_JNITESTActivity_nativeMethod
- (JNIEnv*env,jobjectobj)
- {
- LOGI("JNIINnativeMethod");
- jclasscls=(*env)->GetObjectClass(env,obj);
- staticjmethodIDmid=NULL;
- if(mid==NULL){
- mid=(*env)->GetMethodID(env,cls,"callBack","()V");
- if(mid==NULL){
- return;
- }
- }
- (*env)->CallVoidMethod(env,obj,mid);
- LOGI("JNICALLTheHellodriver");
- callDriver();
- }
- intcallDriver()
- {
- intfd=-1;
- intval=0;
- fd=open(DEVICE_NAME,O_RDWR);
- if(fd==-1){
- LOGI("Failedtoopendevice%s.\n",DEVICE_NAME);
- return-1;
- }
- LOGI("Readoriginalvalue:\n");
- read(fd,&val,sizeof(val));
- LOGI("%d\n\n",val);
- val=5;
- LOGI("Writevalue%dto%s.\n",val,DEVICE_NAME);
- write(fd,&val,sizeof(val));
- LOGI("Readthevalueagain:\n");
- read(fd,&val,sizeof(val));
- LOGI("%d\n\n",val);
- close(fd);
- return0;
- }
- jintJNI_OnLoad(JavaVM*vm,void*reserved)
- {
- void*venv;
- LOGI("JNI_OnLoad!");
- if((*vm)->GetEnv(vm,(void**)&venv,JNI_VERSION_1_4)!=JNI_OK){
- LOGE("ERROR:GetEnvfailed");
- return-1;
- }
- returnJNI_VERSION_1_4;
- }
驱动程序需具有一定权限。驱动程序的编写请参考相关书籍。
重新把生成的libInstanceMethodCall.so 考入开发版/system/lib目录下,重新安装原有的应用程序。
输出如下:
[html] view plain copy
- I/ActivityManager(1228):Starting:Intent{act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER]flg=0x10200000cmp=com.zhang.jni.test/.JNITESTActivity}frompid1311
- I/ActivityManager(1228):Startproccom.zhang.jni.testforactivitycom.zhang.jni.test/.JNITESTActivity:pid=8417uid=10032gids={}
- D/dalvikvm(8417):Debuggerhasdetached;objectregistryhad1entries
- I/JNI_C(8417):JNI_OnLoad!
- V/ZhangFang_JNITEST(8417):ActivitycallNativeMehotd:
- I/JNI_C(8417):JNIINnativeMethod
- V/ZhangFang_JNITEST(8417):NativemethodcalltheActivitymethods
- V/ZhangFang_JNITEST(8417):****************NativeMethodcallbacksuccessfully!********
- I/JNI_C(8417):JNICALLTheHellodriver
- I/JNI_C(8417):Readoriginalvalue:
- I/JNI_C(8417):5
- I/JNI_C(8417):
- I/JNI_C(8417):Writevalue5to/dev/hello.
- I/JNI_C(8417):Readthevalueagain:
- I/JNI_C(8417):5
- I/JNI_C(8417):
- I/ActivityManager(1228):Displayedcom.zhang.jni.test/.JNITESTActivity:+138ms
- D/dalvikvm(1311):GC_EXPLICITfreed61K,46%free3160K/5767K,external3137K/3867K,paused25ms
调用驱动成功。
该方法虽然在效率上有点提升,但是不符合android框架,使用时需谨慎。
更多相关文章
- android学习日记13--数据存储之ContentProvide
- Android/Ophone应用程序数字签名
- android中跨进程通讯的4种方式
- Android(2.1) Activity的详细讲解
- Android(安卓)解析gbk、gb2312编码的xml文件(转)
- Android通过JNI调用驱动程序(完全解析实例)
- Android(安卓)监听安装和卸载
- Forge模型转换和网页浏览在Android上的实践
- Android文件下载方式选择