android NDK

来源:互联网 发布:2017网络直播平台排名 编辑:程序博客网 时间:2024/06/05 08:12

首先 AS版本最好在2.2以上,接着下载NDK,在AS里面,下载LLDB跟NDK


下载完成的NDK会在sdk文件夹下面的ndk-bundle 将这个路径配置到环境变量中,配置好之后,可以在cmd里面 输入ndk-build查看是否安装好

接着,新建一个项目,新建一个类,在里面写一个用native标注的方法跟设置so库的名字


接着生成.h文件  在AS的Terminal中,进入src\main目录下,输入javah -d jni -classpath E:\ASproject\MyApplication\app\src\main\java com.example.hl.myapplication.JniUtils

其中 -d 后面接生成.h文件的路径,可以看到,我在main下面就有一个名字是jni的文件夹,不设置的话,就在当前路径下, -classpath后面接JAVA类,必须的绝对路径,文件夹跟包名之间用空格隔开,如果本身路径就在包名下,直接 javah -jni JniUtils,就行,关于javah,可以在cmd命令下直接输入javah,就可以看到javah的所有命令

生成的.h文件如下,

可以看到 函数的名称格式为 Java_包名_类名_函数名,这个.h文件主要用于写.c文件时的参照,如果熟悉这种格式,不生成也行

接着,新建一个jni文件夹,在里面新建.c文件,

可以看到这个.c文件跟.h文件很类似,就改了点参数属性而已

接着,新建一个Android,mk文件,必须是这个名字,在里面写上 

LOCAL_PATH := $(call my-dir)  每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文my-dir 则由Build System提供。返回包含Android.mk的目录路径。一般不修改

include $(CLEAR_VARS) CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。LOCAL_MODULE    := hehehe 生成的so文件名字,跟上面设置的一样,生成后,会是 libhehehe.so 

LOCAL_MODULE    := wahaha.c  就是我们的.c文件

include $(BUILD_SHARED_LIBRARY)   BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。它负责收集自从上次调用 include $(CLEAR_VARS)  后的所有LOCAL_XXX信息。并决定编译为什么。一般不修改

最后在gradle里面设置

接着 在gradle.properties 里面配置

android.useDeprecatedNdk=true

关于so体系的生成,还可以在jni目录下生成Application.mk文件

在里面配置

APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptions -std=c++0xAPP_ABI := armeabi-v7a armeabi x86 x86_64APP_PLATFORM := android-18


这样就可以不用再gradle里面的android配置ndk了

这样就行了,运行后,会在build里面生成so文件

大功告成,把so文件拷贝出来就行了,objs文件夹可以删除,测试的话,在main函数里调用JniUtils.getStringFromJni()

查看打印信息就可以了

生成so库还可以在Terminal中直接定位到jni文件夹目录下,输入ndk-build,会直接生成libs跟obj文件夹,删除obj就行了


如果不想输入命令行,也可以设置一下,在setting里面设置




暂时三个方法够了,然后右键写好的class


这样就会在jni文件夹里生成.h文件,在写好c文件跟mk文件后,右键jni文件夹


这样就会在main目录下生成libs跟obj文件,里面会有so文件,搞定