目录
2、新建一个zylib.cpp文件,会出现一些提示信息,告诉你工程里面没引用,在CMakeLists.txt文件中配置后即可消除。
3、因为目的是生成libzyLib.so文件,将native-lib相关的内容删掉,然后修改CMakeLists.txt文件。
5、编译工程,Build--> MakeProject;会在\app\build\intermediates\cmake\debug下面看到相应的libzyLib.so文件。
3、在build.gradle文件中的android{}中添加下面代码; jniLibs.srcDirs=["xxx"],xxx对应上面复制存放的so文件库路径
4、新建java package名称要和之前packag相同com.example.dell.zylib
本机环境
win10 64位系统
【一】AS工程生成.so文件
1、假如要生成的.so文件名称为libzyLib.so;
新建工程 勾选 include C++ support 选项,一路next,创建默认工程
目录结构如下图
2、新建一个zylib.cpp文件,会出现一些提示信息,告诉你工程里面没引用,在CMakeLists.txt文件中配置后即可消除。
该cpp文用作调用c++ 代码的实现。先暂时放下。
3、因为目的是生成libzyLib.so文件,将native-lib相关的内容删掉,然后修改CMakeLists.txt文件。
下面将工程默认生成的native-lib.cpp删除,选中delete的时候,选择ok。会提示其他地方有使用到该文件里的内容。
“View Usages”看看哪些地方使用到,说明是CMakeLists.txt里面由使用到该文件的地方。
MainActivity.java文件中和native-lib相关的注释or删掉。
将之前的native-lib改掉,替换为zyLib ,引用的路径改为上面新建的cpp文件“src/main/cpp/zyLib.cpp”
修改后的CmakeLists.txt文件:
# For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/studio/projects/add-native-code.html # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either STATIC # or SHARED, and provides the relative paths to its source code. # You can define multiple libraries, and CMake builds them for you. # Gradle automatically packages shared libraries with your APK. add_library( # Sets the name of the library. zyLib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/zyLib.cpp) # Searches for a specified prebuilt library and stores the path as a # variable. Because CMake includes system libraries in the search path by # default, you only need to specify the name of the public NDK library # you want to add. CMake verifies that the library exists before # completing its build. 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) # Specifies libraries CMake should link to your target library. You # can link multiple libraries, such as libraries you define in this # build script, prebuilt third-party libraries, or system libraries. target_link_libraries( # Specifies the target library. zyLib # Links the target library to the log library # included in the NDK. ${log-lib})
4、新建一个java类,名称为zyLib
package com.example.dell.zylib; public class zyLib { static { System.loadLibrary("zyLib"); } public static native int Add(int x, int y); }
新建jni文件夹,成功后在main下面会有一个jni文件夹内容
File-->Settings 进行配置外部工具javah
在zyLib.java文件右键选择刚才配置的javah工具,使用后会在jni文件夹中生成zyLib.java对应的com_example_dell_zylib_zyLib.h头文件
现在回到上面2建立的zyLib.cpp文件中进行相关的代码编写
#include "../jni/com_example_dell_zylib_zyLib.h" JNIEXPORT jint JNICALL Java_com_example_dell_zylib_zyLib_Add (JNIEnv *env, jclass jobj, jint x, jint y) { return (x+y); }
5、编译工程,Build--> MakeProject;会在\app\build\intermediates\cmake\debug下面看到相应的libzyLib.so文件。
右键选中拖到下面terminal中,会自动打开到.so文件所在目录里面,输入nm libzyLib.so|find "Java"查看里面的so文件里面的函数
至此我们的libzyLib.so文件生成结束。
系统默认libXXXX.so,XXXX为自己so文件名
【二】AS调用生成.so文件
使用在【一】中生成的libzyLib.so文件
1、新建一个新的工程命名为Call_zyLib
2、将上面生成的so文件复制到libs目录下结果如下图
3、在build.gradle文件中的android{}中添加下面代码; jniLibs.srcDirs=["xxx"],xxx对应上面复制存放的so文件库路径
sourceSets {
main {
// 设置引用的so库路径
jniLibs.srcDirs = ["libs"]
}
}
4、新建java package名称要和之前packag相同com.example.dell.zylib
然后建立一个java类,此处java类名也要和生成时的类名相同,zyLib
5、在MainActivity.java里面调用对应的函数
查看生成的.so文件相关库依赖
使用ndk-bundle中的readelf.exe工具:
readelf -d libTestLib_2rd.so|find "NEEDED"
查看.so文件导出函数
- 方法一
nm -D **.so
但这样能看到所有的导出,乱七八糟的很多,筛选用:
nm **.so | find XX
- 方法二
objdump -tT **.so|
【参考】
https://www.jianshu.com/p/e689d0196a17
https://www.jianshu.com/p/09ff3300f453
http://www.cnblogs.com/daniel-shen/archive/2006/10/16/530587.html
https://blog.csdn.net/iuiang6/article/details/7919222
https://www.cnblogs.com/mmmmar/p/6055700.html
Android NDK开发扫盲及最新CMake的编译使用 :https://www.jianshu.com/p/6332418b12b1