日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中APK直接通过JNI访问驱动

發(fā)布時(shí)間:2025/4/16 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中APK直接通过JNI访问驱动 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊打開鏈接

1.新建文件LED-JNI.c,內(nèi)容如下:

[cpp]?view plaincopy
  • #include?<jni.h>??/*?/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/?*/??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<sys/types.h>??
  • #include?<sys/stat.h>??
  • #include?<fcntl.h>??
  • #include?<sys/ioctl.h>??
  • ??
  • #include?<android/log.h>??/*?liblog?*/??
  • ??
  • //__android_log_print(ANDROID_LOG_DEBUG,?"JNIDemo",?"native?add?...");??
  • ???
  • #if?0??
  • typedef?struct?{??
  • ????char?*name;?????/*?Java里調(diào)用的函數(shù)名?*/??
  • ????char?*signature;???/*?JNI字段描述符,?用來表示Java里調(diào)用的函數(shù)的參數(shù)和返回值類型?*/??
  • ????void?*fnPtr;?????/*?C語言實(shí)現(xiàn)的本地函數(shù)?*/??
  • }?JNINativeMethod;??
  • #endif??
  • ??
  • static?jint?fd;??
  • ??
  • jint?ledOpen(JNIEnv?*env,?jobject?cls)??
  • {??
  • ????fd?=?open("/dev/msmgpio",?O_RDWR);??
  • ????__android_log_print(ANDROID_LOG_DEBUG,?"LEDDemo",?"native?ledOpen?:?%d",?fd);??
  • ????if?(fd?>=?0)??
  • ????????return?0;??
  • ????else??
  • ????????return?-1;??
  • }??
  • ??
  • void?ledClose(JNIEnv?*env,?jobject?cls)??
  • {??
  • ????__android_log_print(ANDROID_LOG_DEBUG,?"LEDDemo",?"native?ledClose?...");??
  • ????close(fd);??
  • }??
  • ??
  • jint?ledCtrl(JNIEnv?*env,?jobject?cls,?jint?which,?jint?status)??
  • {??
  • ????int?ret?=?ioctl(fd,?which,?status);??
  • ????__android_log_print(ANDROID_LOG_DEBUG,?"LEDDemo",?"native?ledCtrl?:?%d,?%d,?%d",?which,?status,?ret);??
  • ????return?ret;??
  • }??
  • ??
  • static?const?JNINativeMethod?methods[]?=?{??
  • ????{"ledOpen",?"()I",?(void?*)ledOpen},??
  • ????{"ledClose",?"()V",?(void?*)ledClose},??
  • ????{"ledCtrl",?"(II)I",?(void?*)ledCtrl},??
  • };??
  • ??
  • /*?System.loadLibrary?*/??
  • JNIEXPORT?jint?JNICALL??
  • JNI_OnLoad(JavaVM?*jvm,?void?*reserved)??
  • {??
  • ????JNIEnv?*env;??
  • ????jclass?cls;??
  • ??
  • ????if?((*jvm)->GetEnv(jvm,?(void?**)&env,?JNI_VERSION_1_4))?{??
  • ????????return?JNI_ERR;?/*?JNI?version?not?supported?*/??
  • ????}??
  • ????cls?=?(*env)->FindClass(env,?"mobiletek/hardlibrary/HardControl");??
  • ????if?(cls?==?NULL)?{??
  • ????????return?JNI_ERR;??
  • ????}??
  • ??
  • ????/*?2.?map?java?hello?<-->c?c_hello?*/??
  • ????if?((*env)->RegisterNatives(env,?cls,?methods,?sizeof(methods)/sizeof(methods[0]))?<?0)??
  • ????????return?JNI_ERR;??
  • ??
  • ????return?JNI_VERSION_1_4;??
  • }??

  • 2.編譯生成libhardcontrol.so,使用交叉編譯器prebuilts/gcc/Linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc:
    arm-linux-androideabi-gcc -fPIC -shared LED-JNI.c -o libhardcontrol.so -I /usr/lib/jvm/Java-1.7.0-openjdk-amd64/include/? -nostdlib prebuilts/ndk/9/platforms/Android-19/arch-arm/usr/lib/libc.so -I prebuilts/ndk/9/platforms/android-19/arch-arm/usr/include prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/liblog.so


    3.在Android Studio工程的app/libs目錄下新建armeabi目錄,將編譯生成的libhardcontrol.so文件放入該目錄下。

    4.
    在工程目錄app/src/main/java/mobiletek下新建hardlibrary目錄,在hardlibrary目錄下新建HardControl.java文件,文件內(nèi)容如下:

    [java]?view plaincopy
  • package?mobiletek.hardlibrary;??
  • ??
  • public?class?HardControl?{??
  • ????public?static?native?int?ledCtrl(int?which,?int?status);??
  • ????public?static?native?int?ledOpen();??
  • ????public?static?native?void?ledClose();??
  • ??
  • ????static?{??
  • ????????try?{??
  • ????????????System.loadLibrary("hardcontrol");??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • ??
  • }??

  • 5.編輯app/src/main/java/mobiletek/led/MainActivity.java文件,內(nèi)容如下:
    [java]?view plaincopy
  • package?mobiletek.led;??
  • ??
  • import?android.os.RemoteException;??
  • import?android.support.v7.app.AppCompatActivity;??
  • import?android.os.Bundle;??
  • import?android.widget.Button;??
  • import?android.view.View;??
  • import?android.widget.CheckBox;??
  • import?android.widget.Toast;??
  • import?mobiletek.hardlibrary.*;??
  • ??
  • public?class?MainActivity?extends?AppCompatActivity?{??
  • ????private?boolean?ledon?=?false;??
  • ????private?Button?button?=?null;??
  • ??
  • ????private?CheckBox?checkBoxLed1?=?null;??
  • ????private?CheckBox?checkBoxLed2?=?null;??
  • ????private?CheckBox?checkBoxLed3?=?null;??
  • ????private?CheckBox?checkBoxLed4?=?null;??
  • ??
  • ????int?[]ledctrl?=?{0x12,?0x34,?0x56,?0x78};??
  • ??
  • ????class?MyButtonListener?implements?View.OnClickListener?{??
  • ????????@Override??
  • ????????public?void?onClick(View?v)?{??
  • ????????????ledon?=?!ledon;??
  • ????????????if?(ledon)?{??
  • ????????????????button.setText("ALL?OFF");??
  • ????????????????checkBoxLed1.setChecked(true);??
  • ????????????????checkBoxLed2.setChecked(true);??
  • ????????????????checkBoxLed3.setChecked(true);??
  • ????????????????checkBoxLed4.setChecked(true);??
  • ??
  • ????????????????for?(int?i?=?0;?i?<?4;?i++)??
  • ????????????????????HardControl.ledCtrl(ledctrl[i],?1);??
  • ????????????}??
  • ????????????else?{??
  • ????????????????button.setText("ALL?ON");??
  • ????????????????checkBoxLed1.setChecked(false);??
  • ????????????????checkBoxLed2.setChecked(false);??
  • ????????????????checkBoxLed3.setChecked(false);??
  • ????????????????checkBoxLed4.setChecked(false);??
  • ??
  • ??
  • ????????????????for?(int?i?=?0;?i?<?4;?i++)??
  • ????????????????????HardControl.ledCtrl(ledctrl[i],?0);??
  • ??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????public?void?onCheckboxClicked(View?view)?{??
  • ????????//?Is?the?view?now?checked???
  • ????????boolean?checked?=?((CheckBox)?view).isChecked();??
  • ??
  • ????????//?Check?which?checkbox?was?clicked??
  • ????????switch(view.getId())?{??
  • ????????????case?R.id.LED1:??
  • ????????????????if?(checked)?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED1?on",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[0],?1);??
  • ????????????????}??
  • ????????????????else?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED1?off",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[0],?0);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?R.id.LED2:??
  • ????????????????if?(checked)?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED2?on",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[1],?1);??
  • ????????????????}??
  • ????????????????else?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED2?off",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[1],?0);??
  • ????????????????}??
  • ????????????????break;??
  • ??
  • ????????????case?R.id.LED3:??
  • ????????????????if?(checked)?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED3?on",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[2],?1);??
  • ????????????????}??
  • ????????????????else?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED3?off",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[2],?0);??
  • ????????????????}??
  • ????????????????break;??
  • ??
  • ????????????case?R.id.LED4:??
  • ????????????????if?(checked)?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED4?on",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[3],?1);??
  • ????????????????}??
  • ????????????????else?{??
  • ????????????????????Toast.makeText(getApplicationContext(),?"LED4?off",?Toast.LENGTH_SHORT).show();??
  • ????????????????????HardControl.ledCtrl(ledctrl[3],?0);??
  • ????????????????}??
  • ????????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??
  • ????????button?=?(Button)findViewById(R.id.BUTTON);??
  • ????????HardControl.ledOpen();??
  • ??
  • ????????checkBoxLed1?=?(CheckBox)?findViewById(R.id.LED1);??
  • ????????checkBoxLed2?=?(CheckBox)?findViewById(R.id.LED2);??
  • ????????checkBoxLed3?=?(CheckBox)?findViewById(R.id.LED3);??
  • ????????checkBoxLed4?=?(CheckBox)?findViewById(R.id.LED4);??
  • ??
  • ????????button.setOnClickListener(new?MyButtonListener());??
  • ??
  • ????????/*?
  • ????????button.setOnClickListener(new?View.OnClickListener()?{?
  • ????????????public?void?onClick(View?v)?{?
  • ????????????????//?Perform?action?on?click?
  • ????????????????ledon?=?!ledon;?
  • ????????????????if?(ledon)?
  • ????????????????????button.setText("ALL?OFF");?
  • ????????????????else?
  • ????????????????????button.setText("ALL?ON");?
  • ????????????}?
  • ????????});?
  • ????????*/??
  • ????}??
  • }??

  • 6.
    修改app/build.gradle文件:
    apply plugin: 'com.android.application'

    android {
    ??? compileSdkVersion 25
    ??? buildToolsVersion "25.0.2"

    ??? defaultConfig {
    ??????? applicationId "mobiletek.led"
    ??????? minSdkVersion 15
    ??????? targetSdkVersion 25
    ??????? versionCode 1
    ??????? versionName "1.0"
    ??? }
    +??? sourceSets {
    + ????? main {
    + ????????? jniLibs.srcDirs = ['libs']
    + ???? }
    + ? }

    ??? buildTypes {
    ??????? release {
    ??????????? minifyEnabled false
    ??????????? proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    ??????? }
    ??? }
    }

    dependencies {
    ??? compile fileTree(dir: 'libs', include: ['*.jar'])
    ??? testCompile 'junit:junit:4.12'
    ??? compile 'com.android.support:appcompat-v7:25.1.0'
    }


    7.
    編譯,生成apk,安裝到開發(fā)板,打開app,即可操作LED。

    編譯生成的libhardcontrol.so可以不隨apk一起打包,單獨(dú)放在/system/lib或者/vendor/lib目錄均可,這樣,就不需要新建armeabi目錄,也不需要修改app/build.gradle文件。

    總結(jié)

    以上是生活随笔為你收集整理的Android中APK直接通过JNI访问驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。