JavaReport/README.md

190 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 安卓APP
## 目的
1. 实现页面按钮跳转页面
2. 点击按钮后页面显示来自JNI的字符串
## 实验步骤
### 1. 准备开发环境
- Android Studio
- JDK
- NDK创建项目时会自动部署
- CMake创建项目时会自动部署
### 2. 创建一个原生C++安卓项目
![image-20241217213119132](images/image-20241217213119132.png)
> 部署原生C++安卓项目时,路径中不能有空格
>
> 使用了API 28: Android 9.0
### 3. 主页面添加按钮
在`MainActivity.java`中添加一个按钮,点击后跳转到`SecondActivity`
```
package com.example.jnidemoapp;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 页面跳转按钮
Button button = findViewById(R.id.button_go_to_second);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
```
### 4. 创建SecondActivity.java
新建`SecondActivity.java`文件显示来自JNI的字符串
```
package com.example.jnidemoapp;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
// 加载本地库
static {
System.loadLibrary("jnidemoapp");
}
// 声明一个本地方法
public native String stringFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 显示 JNI 返回的字符串
TextView textView = findViewById(R.id.text_jni_string);
textView.setText(stringFromJNI());
}
}
```
### 5. 调整界面布局
- 在`activity_main.xml`中添加一个按钮:
```
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_go_to_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转"
android:layout_centerInParent="true"/>
</RelativeLayout>
```
-`activity_second.xml` 添加一个 `TextView`
```
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_jni_string"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="等待JNI数据..."
android:textSize="18sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
```
### 6. 添加JNI字符串
- 配置`CMakeLists.txt`文件
```
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.22.1)
# Declares and names the project.
project("jnidemoapp")
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
jnidemoapp
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp)
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
jnidemoapp
# Links the target library to the log library
# included in the NDK.
${log-lib})
```
> 这里的库名称需要和SecondActivity.java中的System.loadLibrary函数中的库名称对应
### 7. 编译运行模拟器,并测试
- 起始页面:
![image-20241217214158354](images/image-20241217214158354.png)
- 点击按钮后:
![image-20241217214245435](images/image-20241217214245435.png)