第一个NDK项目

新建项目

在这里插入图片描述

选择Native C++的项目,我这里给项目的命名是NDKTest。

目录分析

在这里插入图片描述
新增了一个cpp目录,里面有一个CMakeLists.cpp文件。

CMakeLists 文件是用来配置C++编译过程的。

# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)  //指定构建项目最小的CMake版本

# Declares the project name. 
project("ndktest")  // 指定项目名称

add_library(${CMAKE_PROJECT_NAME} SHARED
        # List C/C++ source files with relative paths to this CMakeLists.txt.
        native-lib.cpp)  // 指定要编译的源文件

target_link_libraries(${CMAKE_PROJECT_NAME}
        # List libraries link to the target library
        android
        log)  // 指定需要链接的库文件

.cpp 文件是用于编写C/C++ 代码的

Java文件变化
在这里插入图片描述

JNI静态注册

根据函数名将Java代码中的native方法与so中的JNI方法一一对应。

public native String stringFromJNI();

对应规则:以字符串“Java”为前缀,并且用“_”下划线将包名、类名以及native方法名连接起来就是对应的JNI函数名了。

#include <jni.h>
#include <string>

extern "C" // 告诉编译器这个函数是用 C 语言链接约定(而非 C++)来导出的
JNIEXPORT // 指定这个函数是 JNI 导出函数
jstring // 返回类型为 jstring,即 Java 字符串
JNICALL // 这是 JNI 函数的一个标准宏,表示这是一个 JNI 调用的函数
Java_com_example_ndktest_MainActivity_stringFromJNI(
        JNIEnv *env, // JNI 环境指针,用于 JNI 函数调用
        jobject /* this */) // Java对象的this指针
        {
    std::string hello = "Hello from C++"; //创建一个 C++ 字符串
    return env->NewStringUTF(hello.c_str()); // // 使用 JNI 环境指针创建一个新的 Java 字符串,并返回 
}

指定支持的ABI

在app目录下的build文件里,向android标签里新增

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            ndk {
                abiFilters.addAll(arrayOf("arm64-v8a","x86","x86_64","armeabi-v7a"))
            }
        }
    }
    ...
}

同步一下,就可以设置支持的ABI。
可以通过查看apk包里的lib目录来查看支持的ABI平台。
在这里插入图片描述

指定编译后的so的名字

先在CMakeLists里进行修改,把原来的name改成了ndkapp
在这里插入图片描述
然后在java里修改加载的库
在这里插入图片描述
可以通过查看apk的lib目录里对应ABI目录里的so名字来验证是否成功。
在这里插入图片描述

在MainActivity中定义自己的native方法myfunc()

这个方法有一个int类型的参数,且返回值类型为String。

    public native String myFunc(int iParam);

在native层定义对应的JNI方法

extern "C"
JNIEXPORT
jstring
JNICALL
Java_com_example_ndktest_MainActivity_myFunc(
        JNIEnv *env,jobject thiz,jint i_param){
        std::string retVal = "参数是===>:";
        retVal+=i_param;
    return env->NewStringUTF(retVal.c_str());  
}

c_str() 方法是 C++ 中 std::string 类提供的一个成员函数,它用于返回一个指向 C 风格字符串(即以 \0 结尾的字符数组)的指针。

env->NewStringUTF ()是 JNI(Java Native Interface)中的一个方法,用于在 C++ 或 C 中创建一个新的 Java String 对象,其内容是从 UTF-8 编码的 C 字符串创建的。

调用myFunc()方法

Toast.makeText(this,myFunc(97),Toast.LENGTH_SHORT).show();

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值