码迷,mamicode.com
首页 > 移动开发 > 详细

android studio ndk-builld方式开发

时间:2017-08-08 00:26:26      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:androi   关联   动态库   span   ack   执行   color   tps   develop   

之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发。最近想在android studio 切换下,有点不习惯。android studio 为ndk开发提供了两种不同的方式,使用cmake自动编译脚本 和类似eclipse上的ndk-build。这两者之间使用区别在于,如果想直接开发新的单模块可以考虑使用cmake,ide有自带辅助插件,让程序员使用起来更加舒心。如果想在第三方源码库上面做二次开发,或者需要多个源码库关联,感觉还是使用ndk-build会更加灵活,或者说老经验不用重新踩那么多坑。
 
关于环境搭建的可以参考android 开发者文档,里面有详细的说明
 
下面就在android studio建一个ndk的sample项目。
1、新建一个一般项目,添加jni文件夹以及子目录include 存放头文件,src存放源码
技术分享 
2、在java代码中,新建 TestJni类调用native方法,并使用javah命令生成头文件
 技术分享 
3创建相应的方法文件
回到main目录下
技术分享
? classpath:类搜索路径,这里表示从当前的 bin 目录下查找
? d:将生成的头文件放到当前的 jni 目录下
? o: 指定生成的头文件名称,默认以类全路径名生成(包名+类名.h)
注意: -d 和-o 只能使用其中一个参数。
刷新下android studio的项目目录就可以看到
技术分享
上面javah的指令,为了后面方便使用,可以在external tools中自定义。File->Setting->Tools ->External Tools 点击添加
 技术分享
这样就可以在需要包含native方法的的文件中右键使用
4 cmake方法会根据脚本提供自动生成的Android.mk脚本,不过ndk-build 方法就需要自己编写编译配置脚本Android.mk
 
LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \
                    $(LOCAL_PATH)/src
 
LOCAL_SRC_FILES := src/hello-jni.c
 
LOCAL_MODULE    := NativeLib
 
include $(BUILD_SHARED_LIBRARY)
 
Android.mk文档必须以LOCAL_PATH变量的定义开头。
 
LOCAL_PATH := $(call my-dir)
 
Android 构建系统利用LOCAL_PATH来定位源文件。因为将该变量设置为硬编码值并不合适,所以Android构建系统提供了一个名为 my-dir 的宏功能。通过将该变量设置为my-dir宏功能的返回值,可以将其放在当前目录下。
Android 构建系统将CLEAR_VARS变量设置为clear_vars.mk片段的位置。包含Makefile片段可以清除除了LOCAL_PATH 以外的LOCAL_<name>变量,例如LOCAL_SRC_FILES,LOCAL_MODULE   等。
 
include $(CLEAR_VARS)
这样做是因为 Android构建系统在单次执行中解析多个构建文件和模块定义,而LOCAL_<name>是全局变量。清楚他们可以避免冲突,每一个原生组件被称为一个模块。
LOCAL_MODULE  变量用来给这些模块设定一个唯一的名称。下面的代码将该模块的名称设为NativeLib。
 
LOCAL_MODULE    := NativeLib
 
其实
 
LOCAL_MODULE    := libNativeLib
 
结果也是可以的,编译的生成结果,构建系统会自动添加适当的前缀后缀生成动态共享文件 ,如果前面已经添加lib,那么还会是原样,如:libNativeLib.so。可以在路径  "项目路径\unit2\app\build\intermediates\ndkBuild\debug\obj\local\架构类型\"看到。
 
用LOCAL_C_INCLUDES 指定头文件的搜索路径,LOCAL_SRC_FILES指定源文件列表,多个文件可以使用空格分开的多个源文件名字。
 到这里,就简单描述了一个原生项目。编译和生成实际模块的构建系统还需要包含合适的构建系统片段,具体取决于想要生成的模块的类型。
 
include $(BUILD_SHARED_LIBRARY)
其中BUILD_SHARED_LIBRARY是一个指向生成共享文件的脚本。
有下面三种文件生成格式
BUILD_STATIC_LIBRARY:编译为静态库。 
BUILD_SHARED_LIBRARY :编译为动态库 
BUILD_EXECUTABLE:编译为Native C可执行程序
这里就不展开了
 
在android studio编译原生项目,还需要配置module(app)目录下的build.gradle。下面是需要添加的内容
 
android {
       defaultConfig {
      
        ndk{
                 abiFilters "armeabi","armeabi-v7a","x86"
        }
    }
    externalNativeBuild{
         ndkBuild{
             path "src/main/jni/Android.mk"
         }
    }
}
apk在不同硬件平台运行时,要根据cpu架构调用不同的共享文件。
 
ndk{
                 abiFilters "armeabi","armeabi-v7a","x86"
  }
就会生成三种适合不同cpu架构的共享文件,
技术分享
不配置的话,系统将会默认生成支持的所有架包,如果ndk配置发生改变,要clean project
技术分享
 
 
externalNativeBuild{
         ndkBuild{
             path "src/main/jni/Android.mk"
         }
    }
 
选择cmake还是ndk-build都需要在这里面写明脚本路径
接下来就跑跑项目看效果。
 
 
 
 
 
 
 
 
 
 
 
 
 

android studio ndk-builld方式开发

标签:androi   关联   动态库   span   ack   执行   color   tps   develop   

原文地址:http://www.cnblogs.com/greenteapi/p/7302190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!