NDK编译Android可用so文件

准备工作

  1. 更新NDK到最新版本(如果要使用特定版本的可以在项目Module的build.gradle添加指定版本配置)
  2. 新建cpp文件夹并添加打包文件
    1. 放入需要编译的C/C++文件
    2. 新建桥接文件 native-lib.c(桥接文件内容后边会具体说明)
    3. 新建CMakeLists.txt文件配置编译so选项
      1. //设置Cmake最低版本
        cmake_minimum_required(VERSION 3.4.1)
         
        # 设置项目名称
        project(MyNativeProject)
         
        # 添加源文件 有多少.c文件都需要 .h文件只需要再.c文件内引入就行
        add_library(
                native-lib
                SHARED
                native-lib.c
                ***.c
                ***.c
                ***.c)
        
        # 设置共享库的输出名称
        set_target_properties(native-lib
                PROPERTIES
                LIBRARY_OUTPUT_NAME "file_name")
        
        # 查找日志文件库
        find_library(log-lib log)
         
        # 指定链接器选项
        target_link_libraries(native-lib ${log-lib})

  3. 添加项目Module的build.gradle编译配置
    1. defaultConfig {
              *****
              //其他配置
              *****
              ndkVersion "28.0.12674087"
              // 指定支持的 ABI    
              ndk {
                  abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
              }
      }
      
      externalNativeBuild {
              cmake {
                  // 正确指定 CMakeLists.txt 文件的路径
                  path file("src/main/cpp/CMakeLists.txt")
              }
      }

 桥接文件native-lib.c

        

#include <jni.h>
#include <stdlib.h>

JNIEXPORT jstring JNICALL
Java_com_test_demo_JavaClass_testFun(
        JNIEnv* env,
        jobject /* this */) {
    return (*env)->NewStringUTF(env,"Add Filter Success!");
}

JNIEXPORT jstring JNICALL Java_com_test_demo_JavaClass_testFun

JNIEXPORT:导出方法

jstring:返回一个字符串

Java_com_test_demo_javaClass_testFun:

        com_test_demo:调用Module ID com.test.demo

        JavaClass:Java调用方法类名

        testFun:方法名       

        JNIEnv* env:指向JNI环境的指针,通过它可以访问JNI提供的许多函数,这些函数用于操作Java对象、字符串、数组等。

        jobject:调用该方法的Java对象实例即javaClass的实例对象

JNIEnv* env,jobject /* this */是方法需要的特定参数,后边可以跟C中需要的参数然后调用C的方法。

编译

  1. Sync Gradle
  2. Build->make Project

     编译完成后会在app->build->intermediates->cxx内找到包含各种ABI的so文件。

Android so使用

项目内在main文件夹内(即cpp同级目录)新建jniLibs文件夹放入编译的so文件

在com.test.demo下新建javaClass类并引入so文件

static {
        System.loadLibrary("file_name");
    }

public native String testFun();


public JavaClass(){
        Log.v("输出:",testFun());
}

默认编译的so文件名称是libfile_name,使用的时候需要去除lib字符 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值