生活随笔
收集整理的這篇文章主要介紹了
Android中APK直接通过JNI访问驱动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點擊打開鏈接
1.新建文件LED-JNI.c,內容如下:
[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?*/?????????#if?0??typedef?struct?{??????char?*name;???????????char?*signature;?????????void?*fnPtr;???????}?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},??};??????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;???????}??????cls?=?(*env)->FindClass(env,?"mobiletek/hardlibrary/HardControl");??????if?(cls?==?NULL)?{??????????return?JNI_ERR;??????}??????????????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文件,文件內容如下:
[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文件,內容如下:
[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)?{????????????????????boolean?checked?=?((CheckBox)?view).isChecked();??????????????????????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());?????????????????????????????}??}??
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,安裝到開發板,打開app,即可操作LED。
編譯生成的libhardcontrol.so可以不隨apk一起打包,單獨放在/system/lib或者/vendor/lib目錄均可,這樣,就不需要新建armeabi目錄,也不需要修改app/build.gradle文件。
總結
以上是生活随笔為你收集整理的Android中APK直接通过JNI访问驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。