so动态库生成说明以及遇到的坑
关于安卓的so库开发的摸索,以下是我个人的开发经历总结以及踩过的坑,希望对大家有所帮助,一起进步!下面说明下具体的开发步骤:
一、新建一个加载库文件并且声明和调用动态库本地方法的a.java文件
开发so库,对应需要创建编写一个带有native声明的方法的java类,
java类中定义static方法加载动态链接库,大概如下图:
图1 带有native声明的方法的java类二、 生成a.java对应的.h的文件
在android studio自带的终端里面cd到工程名路径\app\build\intermediates\classes\debug目录下,编写命令javah -d jni文件夹名(可自己定义) 类全名(路径+类名),比如:javah -d jni com.app.example.GpayTestJ 即可对应会生成以下.h文件。
注意这里有个坑:android studio2.2之后的版本有变动, build的文件对应的classes路径有所变动,变成了如下的路径:
build\intermediates\javac\debug\compileDebugJavaWithJavac\classes\
图2 AS2.2.3版本classes路径截图 图3 AS4.1.1版本classes路径截图3. 新建对应的.c文件
在2执行后对应生成的jni文件夹下面新建一个任意命名的.c文件,做好对应的方法实现,这里就要看个人大佬的c语言的功底了。
4. 创建.mk文件
在jni文件夹下新建Android.mk文件
LOCAL_PATH := $(call my-dir) //固定写法,把路径赋给LOCAL_PATH变量
include $(CLEAR_VARS) //清除其他LOCAL变量
LOCAL_MODULE := nativeTest //这个模块的名字,最后生成的.so的名字就是它,要跟java里面的loadLibray的名字一样。
LOCAL_SRC_FILES := nativeTest.cpp //这里是要编译的文件,
include $(BUILD_SHARED_LIBRARY) //SHARED_LIBRARY就是动态库,即.so文件
ps:这里的写法是最简单的一个例子,用的时候把注释去掉。每一行都是很关键,不能省略。至于makefile怎么编写内容比较多,此处不赘述
注意这有个坑:.mk文件的名字一定要是Android.mk,不然ndk-build时生成so会失败!!!!!!!!!!!
图4 命名为非Android.mk时报错情况说明5. 生成so库文件
在步骤2的路径下直接ndk-build即可生成so库文件。
另外:自己创建的jni文件夹也可放到src下面,只要对应cd到它的根路径下,然后直接ndk-build也可以生成对应的so库文件。
以上为大概的so库开发编成,以及个人遇到的坑,描述与不正确或者不妥的,欢迎指出来交流!!!
网友评论