Android Studio RK3399 传感器调试记录(1)

1. 记录目的

从2022.7.18开始对RK3399上的Android系统进行开发了,对于应用层开发其实跟之前是一样的,并未有其他区别,但是因本次需要对GPIO、IIC、USART等外设进行开发,因此还需要对驱动进行开发(但是因为有同时帮助我开发,但他不是很熟悉java语言,所以一些java的接口可能需要我自己来写)。

2.解决方案

以我们目前的认知水平和查询的资料,目前我们两个人的工作安排是:我同事负责驱动开发和C语言测试(修改设备树、编写驱动程序、C语言终端测试);我来负责App端开发(JNI接口编写、App上层调用,因为自己之前也学过一些C语言,可以进行JNI的编写)。现在的话,因为我同事的驱动开发并未完成,因为我主要是在学习JNI编程知识,今天实现的是用C语言实现了两个数的加法,并显示在控件上。

3. JNI

对于JNI(java native interface),是java与C/C++语言的沟通的桥梁,可看作是一种协议,java通过JNI可调用C语言编写的方法,C/C++也可以通过JNI来调用java的方法。
因为C/C++语言运行很快,如果进行算法解析或者需要较为复杂的运行时,这就要求可以通过java的接口来调用C方法,而本次的实验也是如此。
我们这次主要是进行RK3399的外设开发,涉及到GPIO开发,今天做的比较简单,实现两个函数的加法。
对于JNI的流程是:CmakeList会把cpp源文件封装成so库,然后利用gradle构建工具放进apk文件中。

4.实验步骤

(1)新建一个Native C++项目;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)其目录结构如下所示:
在这里插入图片描述
(3)修改程序:布局文件activity_mian.xml
点击按钮后,文本信息“Hello World!!”会变成“13”(5+8)的值,因为在此程序中我已经将代码写死了,大家在尝试的时候可以再放入两个输入框,然后对按钮设置一下监听事件,计算输入框数字的和。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_gravity="center"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_gravity = "center"
        android:textSize="30sp"
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

    <Button
        android:id="@+id/add"
        android:layout_gravity="center"
        android:layout_marginTop="30dp"
        android:text="加法"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

在这里插入图片描述
(4)修改native-lib.cpp文件代码

#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_jniadd_MainActivity_add(JNIEnv *env, jobject thiz, jint a, jint b) {
    // TODO: implement add()
    return a+b;
}

(5)MainActivity中代码:

package com.example.jniadd;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.jniadd.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    // Used to load the 'jniadd' library on application startup.
    static {
        System.loadLibrary("jniadd");
    }

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        TextView tv_content = findViewById(R.id.sample_text);
        Button btn_add = findViewById(R.id.add);


        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "onClick: "+ add(5, 8));
                tv_content.setText(Integer.toString(add(5,8)));
            }
        });
    }
    /**
     * A native method that is implemented by the 'jniadd' native library,
     * which is packaged with this application.
     */
    public native int add(int a, int b);
}

5.实验结论

(1)在MainActivity.java文件中主要分为3个步骤:引入so库—>声明实现函数—>直接调用即可;
(2)在AS环境中,可以在java文件中先声明函数,然后在原函数中可直接利用快捷方式进行添加。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值