開發板 iTOP 6818 除錯手記
最近專案需要,在做ARM 的 iTOP 6818 開發板除錯,邊看手冊學習原理,邊實踐操作熟悉開發環境,
第一步,熟悉開發環境,學習燒寫鏡像檔案,
配置 iTOP 6818 的底層系統是Ubuntu 14.04,上層是Android 5.1,
在PC 上安裝了虛擬機,虛擬機里安裝Ubuntu 14.04,可以生成ubuntu 鏡像檔案,
重啟開發板,OTG 線連接到PC上,在超級終端里回車,進入uboot 模式,輸入fastboot,進入OTG 模式,
PC 的開發工具fastboot 目錄下,輸入fastboot ,,,,,將6個鏡像檔案燒寫到開發板上,
可以看到 開發板啟動android 后的界面, 象一臺安卓手機啟動后的界面,心里就輕松了,
由于買的是4.3 寸的小螢屏,開始不習慣其配置界面,耽誤了一些時間,建議買7 寸的顯示屏,
開發板上的back 按鈕是回退到上次的安卓選單界面,非常有用,sleep 按鈕是用來喚醒螢屏的,
通過開發板串口連接PC,在PC 上的超級終端里查看開發板的運行資訊,
第二步,熟悉Android studio4.4.1,學習編譯庫檔案和安卓軟體,
PC 上安裝JDK1.8 和Android studio4.4.1,配置環境引數,
注意:不要去安裝廠家網盤下載的android studio1.5 軟體去運行各樣例,被坑過3天,
先編譯了一個hello,moon !程式,下載到開發板上,顯示出hello,moon!了,相信你的信心就倍增了,
備注:記得先將開發板設定為開發者模式和USB 除錯模式,否則PC的ADB 設備顯示不出來,也就是PC上無法和開發板建立聯系,無法除錯,
因為燒寫手冊上的鏡像檔案,可能會將USB 除錯模式關閉了,
底層程式用C 語言,需要先在Android Studio 的SDK-SDK tools里下載Cmake編譯工具,
Android Studio 里創建一個Native C++ 專案,例如 jnitest,language 配置Java(如果選默認的,會掉進坑里),Minimum SDK 配置Android 5.1,C++ 標準配置C++ 11,
1)在MainActivity 里,創建三個方法,分別對應打開、關閉、控制燈,
2)在native-lib.cpp 中,象C語言一樣,添加頭檔案,寫JNI 代碼,實作打開、關閉、控制燈的控制,
#include <android/log.h>,為安卓列印除錯資訊的頭檔案,
設定燈的初始化狀態 fd = 0;
點擊編譯,在默認路徑下,可以看到生成的 project/app/build/cmake/obj/ armeabi-v7a/, so 庫了,
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.jnitest2"
minSdkVersion 22
targetSdkVersion 30
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
abiFilters "armeabi-v7a"
abiFilters "arm64-v8a"
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
// pickFirsts:當出現重復檔案,會使用第一個匹配的檔案打包進入apk
pickFirst 'lib/armeabi-v7a/libnative-lib.so'
pickFirst 'lib/arm64-v8a/libnative-lib.so'
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
5)更新so 庫檔案,
先洗掉Android Studio 界面左側的 project/app/build/cmake/obj 檔案夾,
再點擊build->make project,就可以在左側的build 目錄下看到新生成的兩個 so 庫檔案libnative-lib.so,
Android Studio 的左上角 FIle -> Close project ,
6)創建應用工程Project
Android Studio 再創建一個新的基于 Empty Activity的上層應用Project Name testjni,
包名一定要選擇前面的Native C++ 專案的包名,例如com.example.jnitest,語言選擇Java(如果不選,會掉進坑里),Minimum SDK 選Android 5.1,
創建成功后,將前面 生成的so庫目錄(即jnitest 里的jnilibs 目錄)全部拷貝到 testjni/app/src/main/
點擊Android studio 的軟體同步圖示,右上角倒數第四個,同步完成后, 工程目錄app/jnilibs 下就可以看到so 檔案夾了,
7)配置管理界面
在activity_main.xml 檔案,點擊code編輯界面,洗掉原有的text配置,設定倆個 button,代碼如下:
8)MainActivity.java 里添加有顏色部分的代碼:
package com.example.jnitest2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
#參考這個庫
static {
System.loadLibrary("native-lib");
}
#宣告led 燈的三個控制方法(和庫檔案宣告的要相同):
public native int LedOpen();
public native int LedClose();
public native int LedIoctl(int nunm,int en);
# 宣告 開、關 兩個按鍵,并且在按鍵的點擊事件里面打開設備節點和進行控制 led 燈的操作
private Button led1_on;
private Button led1_off;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
led1_on=(Button) findViewById(R.id.button1);
led1_off=(Button)findViewById(R.id.button2);
led1_on.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
LedOpen();
LedIoctl(1, 1);
}
});
led1_off.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
LedOpen();
LedIoctl(0, 0);
}
});
}
}
9)AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.jnitest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Testjni">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
10) app 的build.gradle
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.jnitest"
minSdkVersion 22
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
將 開發板通過OTG 線連接PC,連接好以后,我們點擊編譯、運行,
就可以看到 led 控制軟體 下載到開發板上,運行起來了,
點擊界面中的按鈕 LED on、 LED off,可以看到開發板的LED 亮和滅的狀態了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/249930.html
標籤:其他
