開發板 iTOP 6818 調試手記

開發板 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 庫了。

3)打開 CMakeList.txt ,添加下面的一句設置平臺對應的庫文件:
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
 
4)在 app 的 build.gradle裏,配置 紅色部分,這樣只需要生成大多數情況下要用的 armeabi-v7a.so 、 arm64-v8a.so ,且避免同時有兩個 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,代碼如下:

<LinearLayout
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:orientation= "vertical"
android:gravity= "center"
>
<Button
android:id= "@+id/button2"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:text= "LED1 OFF" />
<Button
android:id= "@+id/button1"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_marginTop= "87dp"
android:text= "LED1 ON" />
</LinearLayout>

 

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'
}
11)project 的build.gradle
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 亮和滅的狀態了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章