Android使用JNI生成.so文件并调用(使用CMake的方法)

这篇文字是接着上一篇来写的 Android使用JNI生成.so文件并调用(使用传统生成.h的方法),今天学习一下CMake方式调用JNI生成.so文件,前提是Android Studio 本地集成的NDK插件,如果没有可以在开发工具里边下载,位置在上一篇文章上有,其实也就是这个

                  Android使用JNI生成.so文件并调用(使用CMake的方法)_第1张图片

其实,最取巧的办法是,先用androidstudio创建一个NDK的demo,新建的时候勾选支持c/c++这样你的AS就算之前没有集成过CMake plugin也可以一路下载安装,让系统帮你集成,当然新建一个project去开发NDK的项目永远是最简单的,因为没有其他东西干扰我们,但实际的开发中不可避免的坑就是代码重构,当我们的项目原本和CMake开发完全没什么关系而现在要去集成这样一个功能的时候,问题就来了,上篇文章我们说了如何在现有代码上集成以CMake模式开发传统也就是.h和.c的JNI编程,现在基本上都是用CMake直接编写cpp的模式来开发JNI编程,下面来看demo:

1、先去创建Java层的native函数,因为是demo,函数名可以随意一点,然后在使用的地方调用javaGetString()函数

package com.jni.ndkdemo;
public class JniUtils {
    public native int javaAdd(int x,int y);
    public native String javaGetString();
    static {
        System.loadLibrary("testJNI");
    }
}

2、创建cpp目录以及对应的cpp文件,cpp目录和文件看系统生成的路径都是放在app/src/main/cpp/native-lib.cpp,最后的native-lib.cpp这个文件名称是可以随意取的,其实cpp这个目录你也可以叫app、bpp、zpp(可以任意起名不必非得是写死的字符串,只是说程序员给类、文件起名应当见名知意),cpp目录创建以后,去创建一个后缀为.cpp的文件Android使用JNI生成.so文件并调用(使用CMake的方法)_第2张图片

3、编写CMakeLists.txt,这个文件是做什么的?其实它和android.mk文件是一样的,用CMakeLists.txt构建编译规则,而且它要比android.mk文件简单的多,CMakeLists.txt文件创建路径是在app的根目录下,也就是说跟module的build.gradle文件是一个级别的

cmake_minimum_required(VERSION 3.4.1)
add_library(
            testJNI
            SHARED
            src/main/cpp/arraysAdd-lib.cpp)
find_library(
             log-lib
             log
            )
target_link_libraries(testJNI ${log-lib})

非常简单就这四句,其实主要也是用add_library(生成so库的名称  static/SHARED(静态还是动态库) 源文件的路径),find_library和target_library函数我没有用看demo示例它是和log打印有关的,百度学习吧!可能有的同学会问我要有100个cpp文件应该怎么添加,源文件的路径它只能链接一个啊,我现在能知道的就是 不停的使用add_library()这个函数添加,这是实测有用的,但是要注意,add_library(testJNI SHARED src/main/cpp/native-lib)中的三个参数,第一个参数是生成的so库名称,当我们不停add_library()的时候,要注意生成的so库名称不能重复,否则编译会报错,非常坑,只会告诉你CMakeLists.txt文件有错,具体是哪一行不会显示,要特别注意!!应该还有正规的添加方式,大家要是知道可以留言教一下学渣,

4、当把这些材料都准备好了以后,我们就要将其放入build编译的大环境中,这样代码才会生效,在app/build.gradle文件的android{}函数作用域中添加externalNativeBuild

externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

在defaultConfig{}函数作用域中添加

externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }

Android使用JNI生成.so文件并调用(使用CMake的方法)_第3张图片

5、现在所有的准备工作都做完了,测试输出cpp文件中的字符串,

Android使用JNI生成.so文件并调用(使用CMake的方法)_第4张图片

 

 

你可能感兴趣的:(NDK系列)