开发板 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 亮和灭的状态了。

 

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