在已有的android项目中使用JNI,用javac生成头文件

1.新建一个类,在该类中实现本地方法

在已有的android项目中使用JNI,用javac生成头文件_第1张图片

它可能是红色的,提示找不到对应的jni方法,但是不用管,以后会配置

2. 在命令行对该native方法生成头文件

首先,用cd命令进入该类的目录下,然后输入javac -h .\ 你的.java文件

这里不用javah是因为jdk10之后已经弃用了javah,而使用javac -h代替。另外,这里的.\代表当前目录,不能省,而且.\后有一个空格。

运行之后,会在当前目录下同时生成.class文件和.h头文件

在已有的android项目中使用JNI,用javac生成头文件_第2张图片

3. 在main文件夹下建立新文件夹jni,把刚生成的头文件移入,并新建一个jni.c文件,在其中实现native方法

其实jni文件夹不是必须的,只是把c文件和h文件放一起好管理

4. 编辑jni.c

在已有的android项目中使用JNI,用javac生成头文件_第3张图片

首先include刚生成的头文件,然后写你的native方法,注意方法名必须和头文件中规定的相对应。至于native方法怎么写,语法规则是什么,可以参考https://www.jianshu.com/p/464cd879eab

5. 在app目录下新建CMakeLists.txt文件,内容如下

# value of 3.4.0 or lower.

# 1.指定cmake版本
cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library. ——>2.生成函数库的名字,需要写到程序中的 so 库的名字
        native-lib

        # Sets the library as a shared library. 生成动态函数
        SHARED

        # Provides a relative path to your source file(s).
        # Associated headers in the same location as their source
        # file are automatically included.  ——> 依赖的cpp文件,每添加一个 C/C++文件都要添加到这里,不然不会被编译
        src/main/jni/jni.c
        )

find_library( # Sets the name of the path variable. 设置path变量的名称
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate. #指定要查询库的名字
        log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.  目标库, 和上面生成的函数库名字一致
        native-lib

        # Links the target library to the log library
        # included in the NDK.  连接的库,根据log-lib变量对应liblog.so函数库
        ${log-lib} )

6. 在app目录下的gradle文件中注册CMakeLists.txt文件目录

在已有的android项目中使用JNI,用javac生成头文件_第4张图片

7. 在你包含native方法的类中调用so库

在已有的android项目中使用JNI,用javac生成头文件_第5张图片

这个so库的名字就是你在CMakeLists.txt文件中所定义的

 

然后就可以在你的mainactivity中调用这个类的native方法了!

你可能感兴趣的:(在已有的android项目中使用JNI,用javac生成头文件)