C++编写、生成、调用so库详解(二)

我们上篇中主要讲了怎么去打包so库

C++编写、生成、调用so库详解(一)

这篇我们就来说一些怎么调用so库

目录

1.调用符合JNI标准的so库

2.调用不符合JNI标准的so库


上面说了两种不同类型的so库,我们分别来看一下怎么调用这两种,在调用so库之前,我们先说一下直接调用上面写的C++代码,

1.调用符合JNI标准的so库

符合JNI标准的so库,就是我们上一篇中提到的,写起来麻烦,调用起来方便的so库,

调用这个库需要知道包含本地方法的包名和名还有方法名,要不然不好调用.

我这边为了区分开,就新建了一个普通的Android项目,首先将so库复制进来

C++编写、生成、调用so库详解(二)_第1张图片

放在app->libs目录下,没有目录就新建一个目录

然后打开app的build.gradle文件,注意是app的,不是project的

在android节点下新加以下代码,注意不要加错节点

android {
    ...

    defaultConfig {
        ...
    }

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['libs']
        }
    }
}

然后新建一个Java文件,对应我们前面说到写了一个native-lib的文件,里面对应了一个Java的文件,

我们这边就新建一个Java类

C++编写、生成、调用so库详解(二)_第2张图片

这边注意看圈红的地方,全都是上文中第5条里提到的注意点,一个字母都不能错,我这边的包名和类目都是前面一篇中指定的,各位要替换成自己的

然后就可以直接调用啦

C++编写、生成、调用so库详解(二)_第3张图片

能看到我这边已经调用成功了.

2.调用不符合JNI标准的so库

这类库就是在编写so库的时候,没有将JNI写到so库中,这时候我们就需要在外面自己写JNI了,

调用这类so库需要用到两种文件,一个是so库,还有一个就是so库对应的头文件,

这个写起来就比较麻烦了,

1. 我们将so库复制进来

放在app->libs目录下,没有目录就新建一个目录

然后新建cpp目录,如下

C++编写、生成、调用so库详解(二)_第4张图片

2. 新建cpp目录

可以看到,这边我还新建了一个include文件夹,中间放的是头文件,就是上文中提到的so库对应的头文件,然后新建CMakeLists.txt和native-lib.cpp文件,CMakeLists.txt中我们需要改一下

C++编写、生成、调用so库详解(二)_第5张图片中间标红的地方就就是我们需要改的

include_directories是指定我们刚刚复制进来的头文件的路径,

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI}")就是链接到我们刚刚的libs下面的so库,

target_link_libraries中最后添加我们的so库名字,加到最后,顺序是有规则的.

3. 然后我们就可以开始写JNI了

C++编写、生成、调用so库详解(二)_第6张图片

可以看到和我们上一篇中写的JNI几乎一样,

4. 配置文件

打开app的build.gradle文件,注意是app的,不是project的

添加几个配置节点

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"
            }
            ndk {
                abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
            }
        }
    }

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['libs']
        }
    }

    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }

    ...
}
5. 写外面的Java类

C++编写、生成、调用so库详解(二)_第7张图片

注意,这边有个容易犯错的地方,就是System.loadLibrary,不再是加载sodemo那个库,而是加载我们刚刚写的这个JNI的库,库名字就是CMakeLists.txt中的project("sodemo2"),各位要换成自己的库名字

C++编写、生成、调用so库详解(二)_第8张图片

可以看到,我这边已经调用成功了.

3.结束

至此so库的打包和调用都讲完了,如果有不对的地方希望大家指出来...

你可能感兴趣的:(c++,Android,so库,JNI)