JavaReport/安卓APP.md

5.5 KiB
Raw Blame History

安卓APP

目的

  1. 实现页面按钮跳转页面
  2. 点击按钮后页面显示来自JNI的字符串

实验步骤

1. 准备开发环境

  • Android Studio
  • JDK
  • NDK创建项目时会自动部署
  • CMake创建项目时会自动部署

2. 创建一个原生C++安卓项目

image-20241217213119132

部署原生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

  • 点击按钮后:

    image-20241217214245435