SO动态库的生成

1.SO动态库的生成

     (1)在Android Studio 创建一个新项目TestJNI(项目名可以任意取),在创建项目的过程中注意一下项目名和项目位置,其他的可以根据软件提示创建即可。出现以下界面说明创建工程成功

SO动态库的生成

 

(2)动态库编译工具NDK的配置,在进行SO库生成操作之前,我们要进行一下配置NDK,具体步骤如下:

1)点击左上角的“File”中的“otherthings”点击出现的“Default Project Structure”,在弹出的窗口中查看AndroidNDK Location配置,如果已配置就可以直接关闭,而如果未配置,则直接按提示下载,系统会给你自动配配置

2)在TestJNI中的grade.properties文件末尾添加语句android.useDeprecatedNdk=true

到了这一步NDK的配置就完成了。

(3)编写并生成So动态库

1)在如下图所示的文件夹中创建了一个TestJNI.java文件,该文件主要编写SO动态库实现函数的声明,如我要在SO动态库中实现Add()这个函数,所以在这里我就编写public native int Add(int x,int y);主要在写函数声明时必须添加native。

SO动态库的生成

2)选择工具栏中的“build”里的“makeproject”

3)完成make后,点击左下方的“Terminal”,输入下图所示的两条命令,分别为

Cd app/src/main

javah -d jni -classpathD:\androidBook\TestJNI\app\build\intermediates\classes\debugcom.example.hewall.testjni.TestJNI

在输入第二条命令中,要注意路径的选择,该路径实质就是TestJNI.java文件经过make后的

文件位置,该文件位置如下图所。输入路径过程中要注意debug与com之间空格。

 4)在经过上一步后,你会发现在main目录下出现了一个jni目录,里面会自动生成一个com_example_hewall_testjni_TestJNI.h头文件。该文件内容如下图所示

 SO动态库的生成

从上图中我们可以看出该头文件为public native int Add(int x, int y)提供了JNI接口,即JNIEXPORTjint JNICALL Java_com_example_hewall_testjni_TestJNI_Add(JNIEnv *, jobject,jint, jint);所以我们在jni目录下可以新建一个CPP文件来和该头文件对接,如下图所示

SO动态库的生成

SO动态库的生成

* 在jni目录下你可以用C++编写多个程序。实现你想实现的功能。本文只是做了一个简单演示。

  经过上几步的操作,我们基本上已经完成了SO动态库的编写,剩下的是选择编译生成的体系结构类型和编译而已,编译类型的选择,我们通过

 ndk {

           moduleName "TestJNI"         //生成的so名字

           abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。

       }

将这段话加入app目录下的build.gradle。

5)最后选择上方工具栏的“Build”中的“rebuildproject”,如果报错,就先“clean”一下,然后再“rebuild project”就行,这样我们就完成了so动态库的生成,该动态库在下图所示位置

SO动态库的生成