概述
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文件中先声明函数,然后在原函数中可直接利用快捷方式进行添加。
最后
以上就是慈祥蜡烛为你收集整理的Android Studio RK3399 传感器调试记录(1)1. 记录目的2.解决方案3. JNI4.实验步骤5.实验结论的全部内容,希望文章能够帮你解决Android Studio RK3399 传感器调试记录(1)1. 记录目的2.解决方案3. JNI4.实验步骤5.实验结论所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复