cmake编写jni集成三方so库支持

本文假设读者使用cmake方式编写jni代码,并且已经学会jni基本操作!
JNI集成三方so库支持分为两种情况:

  1. java层代码直接使用三方so库,此时直接编写native函数调用即可
package com.jni.demo.jni_demo_data;

public class DemoDataJni {
    static {
        System.loadLibrary("soName");//加载so库,此处soName替换为你要使用的so库名称
    }
    public native static Object nativeDemoFunction(Object param);//同理,此处替换为你使用的so库函数
}

重点!!!这里的jni加载类,放置的位置非常重要,必须要与so库中RegisterNative函数中 findClass的class全路径类名保持一致,否则so库无法加载会抛找不到so库的异常,一般我们照搬so库的包名结构放置jni加载类,包括参数的传递如果有Object类型,也须如此处理

  1. 需要自己编写jni代码,在cpp文件中加载三方库
    这里插入几点:
    ①我们选择编写的是32位的库还是64位的库是在gradle.build文件中设置,为方便看到位置,把这个文件全部拿过来了
apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    defaultConfig {
        applicationId "com.example.jnidemo"
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        externalNativeBuild {
            cmake {
                //生成多个版本的so文件
                abiFilters 'arm64-v8a', 'armeabi-v7a'//输出指定三种abi体系结构下的so库。
            }
        }
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

②编译生成的so库,默认是在app/build目录下,为方便拿到so库,我们可以在CMakeLists.txt文件中设置so库的生成路径,并且$美元符合后跟的路径可以根据你的需求随意替换指定

cmake_minimum_required(VERSION 3.4.1)
# 指定so生成到libs目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})
add_library(JNIDemo SHARED JNIDemo.cpp)
find_library(log-lib log)
target_link_libraries(JNIDemo ${log-lib})

下面来说在自己编译的JNI代码体系中集成三方so库的方式(差别其实只在CMakelists.txt文件中):

#CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/jni_demo/include/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/jni_demo/)
#添加自己的so
add_library(jni_demo
        SHARED
        ${CMAKE_CURRENT_SOURCE_DIR}/jni_demo/JniResult.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/jni_demo/JniResultImpl.cpp)
find_library( log-lib
                log )
#设置so库的输出路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/xapi_jni_impl/libs/)
#2.添加第三方库
add_library(libtest_calib SHARED IMPORTED)
set_target_properties(libtest_calib
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_CURRENT_SOURCE_DIR}/xapi_jni_impl/libs/arm64-v8a/libtest_calib.so)
#添加链接三方库
target_link_libraries(jni_demo
                      libtest_calib
                      ${log-lib})
CLion是一款由JetBrains开发的集成开发环境(IDE),专门用于C和C++的开发。它提供了丰富的功能和工具,可以帮助开发者更高效地编写、调试和测试代码。 CMake是一个跨平台的构建工具,它可以自动生成用于不同编译器和操作系统的构建脚本。通过使用CMake,我们可以将项目的构建过程与具体的编译器和操作系统解耦,从而实现跨平台的构建。 在CLion中编写JNIJava Native Interface)可执行文件,需要进行以下步骤: 1. 创建一个新的CMake项目:在CLion中选择"File" -> "New Project",然后选择"C++ Executable"作为项目类型。 2. 配置CMakeLists.txt文件:CMakeLists.txt是CMake的配置文件,用于指定项目的构建规则。你可以在该文件中添加JNI相关的配置。 例如,你可以使用`add_library`命令来创建一个动态链接,并将JNI相关的源文件添加到该中。示例代码如下: ``` cmake_minimum_required(VERSION 3.10) project(MyJNIProject) # 添加JNI相关的源文件 add_library(MyJNI SHARED jni_source_file.cpp) # 链接JNI target_link_libraries(MyJNI ${JAVA_JVM_LIBRARY}) ``` 在上述示例中,`jni_source_file.cpp`是包含JNI代码的源文件。`${JAVA_JVM_LIBRARY}`是一个变量,用于指定Java虚拟机的文件。 3. 编写JNI代码:在CLion中创建一个新的C++源文件,编写JNI相关的代码。JNI代码用于在Java和C/C++之间进行交互。 例如,你可以使用`JNIEnv`对象来调用Java方法,使用`jclass`对象来获取Java类的引用,使用`jmethodID`对象来表示Java方法的ID等。 4. 构建和运行项目:在CLion中点击"Build"按钮,CLion将自动执行CMake构建过程,并生成可执行文件。你可以通过点击"Run"按钮来运行生成的可执行文件。 以上是使用CLion和CMake编写JNI可执行文件的基本步骤。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值