博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android JNI直接调用驱动程序
阅读量:5232 次
发布时间:2019-06-14

本文共 5492 字,大约阅读时间需要 18 分钟。

关于如何实现JNI请参考

 

本例想测试一下,绕过硬件抽象层,直接在JNI中调用linux驱动程序。JNI的库有java应用程序加载,也就是本例直接是java应用程序通过JNI调用C程序,再通过C程序直接调用linux驱动程序。

[cpp]
  1. #include "com_zhang_jni_test_JNITESTActivity.h"  
  2. #include <utils/Log.h>  
  3. #include<stdio.h>  
  4. #include<stdlib.h>  
  5. #include<fcntl.h>  
  6.   
  7. #define LOG_TAG "JNI_C"  
  8. #define DEVICE_NAME "/dev/hello"  
  9.   
  10. int callDriver();  
  11. /* 
  12.  * Class:     com_zhang_jni_test_JNITESTActivity 
  13.  * Method:    nativeMethod 
  14.  * Signature: ()V 
  15.  */  
  16. JNIEXPORT void JNICALL Java_com_zhang_jni_test_JNITESTActivity_nativeMethod  
  17.   (JNIEnv *env, jobject obj)  
  18. {  
  19.         LOGI("JNI IN nativeMethod");  
  20.   
  21.         jclass cls=(*env)->GetObjectClass(env,obj);  
  22.         static jmethodID mid = NULL;  
  23.         if(mid == NULL){  
  24.                 mid=(*env)->GetMethodID(env,cls,"callBack","()V");  
  25.                 if(mid == NULL){  
  26.                         return;  
  27.                 }  
  28.         }  
  29.         (*env)->CallVoidMethod(env,obj,mid);  
  30.   
  31.         LOGI("JNI CALL The Hello driver");  
  32.         callDriver();  
  33.   
  34. }  
  35.   
  36. int callDriver()  
  37. {  
  38.         int fd = -1;  
  39.         int val = 0;  
  40.         fd = open(DEVICE_NAME,O_RDWR);  
  41.         if(fd == -1){  
  42.                 LOGI("Failed to open device %s .\n",DEVICE_NAME);  
  43.                 return -1;  
  44.         }  
  45.   
  46.         LOGI("Read original value:\n");  
  47.   
  48.         read(fd,&val,sizeof(val));  
  49.         LOGI("%d\n\n",val);  
  50.   
  51.         val = 5;  
  52.         LOGI("Write value %d to %s.\n",val,DEVICE_NAME);  
  53.         write(fd,&val,sizeof(val));  
  54.   
  55.         LOGI("Read the value again:\n");  
  56.         read(fd,&val,sizeof(val));  
  57.         LOGI("%d\n\n",val);  
  58.   
  59.         close(fd);  
  60.   
  61.         return 0;  
  62. }  
  63. jint JNI_OnLoad(JavaVM* vm, void* reserved)  
  64. {  
  65.     void *venv;  
  66.     LOGI("JNI_OnLoad!");  
  67.   
  68.     if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {  
  69.         LOGE("ERROR: GetEnv failed");  
  70.         return -1;  
  71.     }  
  72.   
  73.      return JNI_VERSION_1_4;  
  74. }  
#include "com_zhang_jni_test_JNITESTActivity.h"#include 
#include
#include
#include
#define LOG_TAG "JNI_C"#define DEVICE_NAME "/dev/hello"int callDriver();/* * Class: com_zhang_jni_test_JNITESTActivity * Method: nativeMethod * Signature: ()V */JNIEXPORT void JNICALL Java_com_zhang_jni_test_JNITESTActivity_nativeMethod (JNIEnv *env, jobject obj){ LOGI("JNI IN nativeMethod"); jclass cls=(*env)->GetObjectClass(env,obj); static jmethodID mid = NULL; if(mid == NULL){ mid=(*env)->GetMethodID(env,cls,"callBack","()V"); if(mid == NULL){ return; } } (*env)->CallVoidMethod(env,obj,mid); LOGI("JNI CALL The Hello driver"); callDriver();}int callDriver(){ int fd = -1; int val = 0; fd = open(DEVICE_NAME,O_RDWR); if(fd == -1){ LOGI("Failed to open device %s .\n",DEVICE_NAME); return -1; } LOGI("Read original value:\n"); read(fd,&val,sizeof(val)); LOGI("%d\n\n",val); val = 5; LOGI("Write value %d to %s.\n",val,DEVICE_NAME); write(fd,&val,sizeof(val)); LOGI("Read the value again:\n"); read(fd,&val,sizeof(val)); LOGI("%d\n\n",val); close(fd); return 0;}jint JNI_OnLoad(JavaVM* vm, void* reserved){ void *venv; LOGI("JNI_OnLoad!"); if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) { LOGE("ERROR: GetEnv failed"); return -1; } return JNI_VERSION_1_4;}

上述代码中callDriver函数调用驱动程序。

 

驱动程序需具有一定权限。驱动程序的编写请参考相关书籍。

 

重新把生成的libInstanceMethodCall.so 考入开发版/system/lib目录下,重新安装原有的应用程序。

输出如下:

[html]
  1. I/ActivityManager( 1228): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zhang.jni.test/.JNITESTActivity } from pid 1311  
  2. I/ActivityManager( 1228): Start proc com.zhang.jni.test for activity com.zhang.jni.test/.JNITESTActivity: pid=8417 uid=10032 gids={}  
  3. D/dalvikvm( 8417): Debugger has detached; object registry had 1 entries  
  4. I/JNI_C   ( 8417): JNI_OnLoad!  
  5. V/ZhangFang_JNITEST( 8417): Activity call Native Mehotd:  
  6. I/JNI_C   ( 8417): JNI IN nativeMethod  
  7. V/ZhangFang_JNITEST( 8417): Native method call the Activity methods  
  8. V/ZhangFang_JNITEST( 8417): ****************Native Method call back successfully!********  
  9. I/JNI_C   ( 8417): JNI CALL The Hello driver  
  10. I/JNI_C   ( 8417): Read original value:  
  11. I/JNI_C   ( 8417): 5  
  12. I/JNI_C   ( 8417):   
  13. I/JNI_C   ( 8417): Write value 5 to /dev/hello.  
  14. I/JNI_C   ( 8417): Read the value again:  
  15. I/JNI_C   ( 8417): 5  
  16. I/JNI_C   ( 8417):   
  17. I/ActivityManager( 1228): Displayed com.zhang.jni.test/.JNITESTActivity: +138ms  
  18. D/dalvikvm( 1311): GC_EXPLICIT freed 61K, 46% free 3160K/5767K, external 3137K/3867K, paused 25ms  
I/ActivityManager( 1228): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zhang.jni.test/.JNITESTActivity } from pid 1311I/ActivityManager( 1228): Start proc com.zhang.jni.test for activity com.zhang.jni.test/.JNITESTActivity: pid=8417 uid=10032 gids={}D/dalvikvm( 8417): Debugger has detached; object registry had 1 entriesI/JNI_C   ( 8417): JNI_OnLoad!V/ZhangFang_JNITEST( 8417): Activity call Native Mehotd:I/JNI_C   ( 8417): JNI IN nativeMethodV/ZhangFang_JNITEST( 8417): Native method call the Activity methodsV/ZhangFang_JNITEST( 8417): ****************Native Method call back successfully!********I/JNI_C   ( 8417): JNI CALL The Hello driverI/JNI_C   ( 8417): Read original value:I/JNI_C   ( 8417): 5I/JNI_C   ( 8417): I/JNI_C   ( 8417): Write value 5 to /dev/hello.I/JNI_C   ( 8417): Read the value again:I/JNI_C   ( 8417): 5I/JNI_C   ( 8417): I/ActivityManager( 1228): Displayed com.zhang.jni.test/.JNITESTActivity: +138msD/dalvikvm( 1311): GC_EXPLICIT freed 61K, 46% free 3160K/5767K, external 3137K/3867K, paused 25ms

调用驱动成功。

 

 

该方法虽然在效率上有点提升,但是不符合android框架,使用时需谨慎。

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3756274.html

你可能感兴趣的文章
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>