Adnroid studio 4.1.3 JNI

转眼之间JNI的编程方式伴随着Android studio的升级进行好几次的大变革,从以前的手动执行javah,ndk-build,生成头文件,手动生成os库方式现在修改为:撰写CMakeLists.txt文件,配置CMakeLists.txt文件,自动生成方法形式进行,再需要花人工去智能实现头文件的生成,c/cpp文件引入的操作。具体实现步骤如下
1.创建CMakeLists.txt文件
app/CMakeLists.txt

#指定CMake构建本地库时所需的最小版本
cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library. 将资源文件生成动态链接库(so文件)的库名称(文件名称:“lib" +设置的名称)
        hello

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).资源文件(C或C++)的相对位置
             src/main/jni/top_foxhome_demo_hellojni_JniUtil.cpp )

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.将所有的add_library中的库链接起来,有多少个add_library成的库就将其添加到这里
        hello  #这个和add_library中的指定的so库名称一致

                       # Links the target library to the log library
                       # included in the NDK.
                        )

2.配置CMakeLists.txt文件
app/build.gradle

    defaultConfig {
    ...
            ndk {
            abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
        }

        externalNativeBuild {
            cmake {
                cppFlags ""
                //生成多个版本的so文件
                abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
            }
        }
    ...
    }
    //与defaultConfig同级节点
        externalNativeBuild {
        cmake {
            path "CMakeLists.txt"  // 设置所要编写的c源码位置,以及编译后so文件的名字
        }
    }

3.撰写Java文件
app/src/main/java/top/foxhome/demo/hellojni/JniUtil.java

package top.foxhome.demo.hellojni;

public class JniUtil {
    static {//"hello"这个名字需要与CMakeLists.txt中配置的一致
        System.loadLibrary("hello");
    }

    public static native String getInfo();

}

3.代码提示自动创建c/c++中的方法

在Java文件中点击native上的提示自动创建即可

4.最后在c/cpp文件中实现方法即可。
注意:可能需要自行创建c或者cpp文件。
项目中提到的源码
https://github.com/JunjieHuang945/helloJNI

发表回复

CAPTCHAis initialing...