Android

编译so文件

2018-08-10  本文已影响0人  暖宝宝_龍

先说明一下,这种方式并不实用于全部情况,只是我自己使用的时候,这种方式成功了,所以记录一下

1:创建一个类useNdk(随意写)

public class useNdk {

    static {

        System.loadLibrary("useNdk");

    }

    public native static int getMsg(int num);

}

这里System.loadLibrary("useNdk");的useNdk是你要编译成so包的名字,getMsg是调用c的方法,生成的so包名字是libuseNdk.so

然后点击Android Studio顶部的Build->Make Project

会在app/build/intermediates/classes/debug下面自动创建class类,比如

创建过后就要手动执行命令生成.h文件

先要cd到debug目录,然后执行:javah -d jni -classpath . 报名+类名

比如我的:D:\android\workspace\doorctrl\doorctrl\app\build\intermediates\classes\debug>javah -d jni -classpath . com.ll.useNdk

不要放过任何一个细节,-classpath后面是空格,然后是点,然后是空格,然后是包名类名

成功的话会在intermediates下生成jni文件夹,里面有.h文件

在src/main下面创建jni文件夹,或者吧上面的jni文件夹copy过来

然后创建.c文件

随便写的一个,主要是#include<com_ll_usendk.h>,引用.h文件,未了能让java调用到.c文件里面的方法

到这里.h文件和.c文件就弄好了,现在就编译

现在build.gradle中添加

ndk {

    moduleName "useNdk"//生成文件名

    cFlags "-DANDROID_NDK -D_RELEASE"//这个对应生成模式

    ldLibs "m","log","jnigraphics"//这个对应LOCAL_LDLIBS但是需要去掉前面的 "l"

    abiFilters "armeabi-v7a", "arm64-v8a", "x86","x86_64"//对应app的api

    stl "stlport_shared"//对应app_stl

}

sourceSets { main { jni.srcDirs= ['src/main/jni','src/main/jni'] } }

externalNativeBuild {

    ndkBuild {

        path 'build/intermediates/ndk/debug/Android.mk'

    }

}

ndk添加在defaultConfig下面

sourceSets和externalNativeBuild与defaultConfig同级的

然后cd到jni目录下,就是src/main/jni

然后执行ndk-build

这样就会在main目录下生成lib文件夹,也有可能会多生成一个obj文件夹,不管他

lib里面的东西就是你想要的so文件了

然后吧lib文件里的东西copy到你想要放的地方就ok了

基本就这些流程了,有些还是比较坑,我也有些地方没有说明白,有什么不懂的可以留言

上一篇下一篇

猜你喜欢

热点阅读