实现android|实现android JNI 直接调用android驱动程序

觉得蛮好玩的,就转载来,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

  1. #include "com_zhang_jni_test_JNITESTActivity.h"
  2. #include
  3. #include
  4. #include
  5. #include
  6. #define LOG_TAG "JNI_C"
  7. #define DEVICE_NAME "/dev/hello"
  8. int callDriver();
  9. /*
  10. * Class:com_zhang_jni_test_JNITESTActivity
  11. * Method:nativeMethod
  12. * Signature: ()V
  13. */
  14. JNIEXPORT void JNICALL Java_com_zhang_jni_test_JNITESTActivity_nativeMethod
  15. (JNIEnv *env, jobject obj)
  16. {
  17. LOGI("JNI IN nativeMethod");
  18. jclass cls=(*env)->GetObjectClass(env,obj);
  19. static jmethodID mid = NULL;
  20. if(mid == NULL){
  21. mid=(*env)->GetMethodID(env,cls,"callBack","()V");
  22. if(mid == NULL){
  23. return;
  24. }
  25. }
  26. (*env)->CallVoidMethod(env,obj,mid);
  27. LOGI("JNI CALL The Hello driver");
  28. callDriver();
  29. }
  30. int callDriver()
  31. {
  32. int fd = -1;
  33. int val = 0;
  34. fd = open(DEVICE_NAME,O_RDWR);
  35. if(fd == -1){
  36. LOGI("Failed to open device %s .\n",DEVICE_NAME);
  37. return -1;
  38. }
  39. LOGI("Read original value:\n");
  40. read(fd,&val,sizeof(val));
  41. LOGI("%d\n\n",val);
  42. val = 5;
  43. LOGI("Write value %d to %s.\n",val,DEVICE_NAME);
  44. write(fd,&val,sizeof(val));
  45. LOGI("Read the value again:\n");
  46. read(fd,&val,sizeof(val));
  47. LOGI("%d\n\n",val);
  48. close(fd);
  49. return 0;
  50. }
  51. jint JNI_OnLoad(JavaVM* vm, void* reserved)
  52. {
  53. void *venv;
  54. LOGI("JNI_OnLoad!");
  55. if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
  56. LOGE("ERROR: GetEnv failed");
  57. return -1;
  58. }
  59. return JNI_VERSION_1_4;
  60. }
上述代码中callDriver函数调用驱动程序。
驱动程序需具有一定权限。驱动程序的编写请参考相关书籍。


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

[html]view plain copy
  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

调用驱动成功。


【实现android|实现android JNI 直接调用android驱动程序】 该方法虽然在效率上有点提升,但是不符合android框架,使用时需谨慎。

    推荐阅读