Android Studio调用 符合JNI标准和非JNI标准的so库总结

来源:互联网 发布:婚纱摄影 知乎 编辑:程序博客网 时间:2024/06/06 23:57
已了解解决方案:
一、既有jar包又有so库

    这种最简单,jar包和so库一起使用的,(比如:百度地图)只需要将jar包放在 libs目录下,然后选中右键add as library 。so 文件也放在libs目录下即可。

二、Android Studio 调用符合JNI标准的 so库 (这类so必须要知道,包含本地方法的包名和类名,否则无法调用)

   1. 将SO文件直接放到libs/armeabi下或者jniLibs(这个需要自己在src/main/下新建),  
   2.新建一个和该SO文件一模一样的包名和类名,和本地方法即Native方法(因为so文件里面的方法你事情肯定知道有哪些)。然后再app 下 的build.gradle  android{ }里面添加如下代码:
//指定动态库路径sourceSets {    main {        jni.srcDirs = []    // disable automatic ndk-build call, which ignore our Android.mk        jniLibs.srcDir 'src/main/libs'    }}
   3.然后代码中System.loadLibrary("xxx"),接下来就可以直接调用xxx_xxx_xxx()方法;
   
三、调用非JNI标准的动态so库文件(这种最复杂,这种必须要有该so对应的头文件,否则无法调用)
1.在 src/main 目录下常见 jni目录,接着需要创建java类文件,Java文件里面是本地native方法。然后利用 android studio的命令行终端进入该工程的Java目录。使用 Javah -jni 包名+类名 命令,生成 对应的.h头文件。
2.将上一步生成的头文件剪切到jni目录下。然后在jni目录下新建 C源文件include之前生成的.h文件并实现相应方法,还要include so文件中对应的头文件,才可以调用里面的方法。依然需要在再app 下 的build.gradle  android{ }里面添加如下代码:
再app 下 的build.gradle  android{ }里面添加如下代码:
//指定动态库路径sourceSets {    main {        jni.srcDirs = []    // disable automatic ndk-build call, which ignore our Android.mk        jniLibs.srcDir 'src/main/libs'    }}

3.在jni目录下创建 application.mk文件代码如下:(即指定生成的so文件所对应的平台)
#APP_ABI := all#APP_ABI := armeabi armeabi-v7a x86APP_ABI :=armeabi
创建android.mk 文件内容如下:以下以调用FFmpeg的so库为例
# Android.mk for FFmpeg## cao jin
# LOCAL_PATH := $(call my-dir)# FFmpeg libraryinclude $(CLEAR_VARS)LOCAL_MODULE := avcodecLOCAL_SRC_FILES := libavcodec-56.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := avdeviceLOCAL_SRC_FILES := libavdevice-56.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := avfilterLOCAL_SRC_FILES := libavfilter-5.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := avformatLOCAL_SRC_FILES := libavformat-56.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := avutilLOCAL_SRC_FILES := libavutil-54.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := postprocLOCAL_SRC_FILES := libpostproc-53.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := swresampleLOCAL_SRC_FILES := libswresample-1.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := swscaleLOCAL_SRC_FILES := libswscale-3.soinclude $(PREBUILT_SHARED_LIBRARY)# Programinclude $(CLEAR_VARS)LOCAL_MODULE := xxxx(最终生成的自己的so的名字,这个可以随便起)LOCAL_SRC_FILES :=xxx.c ffmpeg_mod.c ffmpeg_opt.c ffmpeg_filter.c cmdutils.cLOCAL_C_INCLUDES += $(LOCAL_PATH)/includeLOCAL_LDLIBS := -llog -lzLOCAL_SHARED_LIBRARIES := avcodec avdevice avfilter avformat avutil postproc swresample swscaleinclude $(BUILD_SHARED_LIBRARY)

以上LOCAL_MOUDLE := 这里是写的最终生成的自己的so文件的名字。     LOCAL_SRC_FILES : = 自己的  创建的c文件名。

3.最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;(执行ndk-build的时候首先打开as的命令行终端,然后进入工程目录下的jni目录下)  先生成头文件 







个人水平有限,如有错误,谢谢指出来出,高手请忽略

原创粉丝点击