NDK(二) 还是HelloWorld

1. NDK(一)helloworld 需要使用 ndk-build 命令将 C/C++ 文件build成so文件后System.loadLibrary实际上加载的是so文件。

2.使用CMakeLists.txt 直接加载C/C++ 文件

NDK(二) 还是HelloWorld

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.4.1)

# 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.
             cmake-hello
             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cmake/cmake-hello.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.
                       cmake-hello

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
# SHARED名称更改报错
# src/main/cmake/cmake-hello.cpp  路径注意正确
cmake-hello.cpp
#include <jni.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_movitech_myapplication_MainActivity_hello(JNIEnv *env, jclass type) {
    return env->NewStringUTF("hello world From C.cmake");
}

3.build.gradle

NDK(二) 还是HelloWorld

android {
    defaultConfig {    
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }    
    }   
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}
4.调用

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    TextView des = findViewById(R.id.des);
    des2.setText(hello());
}

public static native String hello();

static {
    System.loadLibrary("cmake-hello");
}

5.show

NDK(二) 还是HelloWorld