Android Studio 中关于NDK编译及jni header生成的问题
之前由于工作原因使用grails这个基于groovy的框架做项目,对groovy感觉很好。
基于groovy的gradle构建系统对我而言自然也是好的没得说。
Android Studio 正式版出来没多久,不完善的地方自然很多,对于从eclipse转来的伙伴们而言,不了解groovy的话对于gradle android的dsl自然是一头雾水,其实groovy蛮好,花点时间学学,目前已经支持android开发了。
最近干的活设计到NDK开发,在编译时遇到一些不好搞定的问题。
gradle 的NDK编译
使用gradle编译ndk后会发现,gradle其实是自己按dsl生成了android.mk,然后执行ndk-build命令,仔细对比会发现,它没有生成application.mk。那么问题来了,对于我的项目而言,使用gradle总是编译不过去,而自己运行ndk-build则不会出现问题。
构建系统本来就是解决了这种批处理问题,不想抛开gradle而手动去编译,干脆就让gradle执行自己的ndkbuild Task。
通过不断试错,整理如下Task:
// 编译NDK代码
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
// android.mk 地址 ,自行更改
def androidMK = "$projectDir/src/main/jni/Android.mk"
// application.mk 地址, 自行更改
def applicationMK = "$projectDir/src/main/jni/Application.mk"
def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def cmd = ["$ndkDir/ndk-build", "NDK_PROJECT_PATH=$buildDir",
"APP_BUILD_SCRIPT=$androidMK", "NDK_APPLICATION_MK=$applicationMK"]
commandLine cmd
}
// 打包native库, 会在编译java代码后执行
task ndkLibsToJar(type: Zip, dependsOn: ["compileDebugJava", ndkBuild],
description: 'Create a JAR file of the native libs') {
destinationDir new File(projectDir, 'libs')
baseName 'ndk-libs'
extension 'jar'
from(new File(buildDir, 'libs')) { include '**/*.so' }
into 'lib/'
}
dependencies {
compile fileTree(dir: new File(projectDir, 'libs'), include: ['*.jar'])
}
当然,首先要确保项目根目录下 local.properties 中有ndk的目录位置的设定 ndk.dir=/YOUR_NDK_FOLDER
生成JNI头文件
本来javah的参数就麻烦,有其实classpath的设定,还得指定包名,很是麻烦,如果包含native声明方法的类中包含了android库,不指定好android.jar就更麻烦。
// 生成jni头文件,在编译java后运行
task generateJNI(dependsOn: "compileDebugJava",
description: 'Create jni header'){
//要生成的类名, 可以多个
def classes = ["org.jcuraengine.JCuraEngine"]
//jni生成到哪里
def destdir = "$projectDir/src/main/jni/jcuraengine"
// 获取android jar
def rootDir = project.rootDir
def localProperties = new File(rootDir, "local.properties")
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
def sdkDir = properties.getProperty('sdk.dir')
def androidJarPath = sdkDir + "/platforms/" + android.compileSdkVersion + "/android.jar"
def classesName = ""
classes.each{
classesName += " $it"
}
// 调用 javah
try {
// exec会出现错误,这里使用ant
// 第一次运行这个task时,会出现错误,是android studio导致的,运行两次既可,忽视第一次执行时的异常
// 当然,注意观察第一次的异常,确保不是代码自身问题。
ant.javah(class: classesName, destdir: destdir, classpath:"$androidJarPath:$buildDir/intermediates/classes/debug/")
} catch (def e) {
println e
}
}
这两个task,在android stuido右侧gradle tasks版面中会自动添加的。
Android Studio 中关于NDK编译及jni header生成的问题的更多相关文章
- 在Android studio中进行NDK开发
在Android studio中进行NDK开发 分类: Android平台 软硬件环境 ubuntu kylin 14.04 红米note增强版 Android studio 0.8.6 ndk ...
- 如何在Android Studio中指定NDK位置?
如何在Android Studio中指定NDK位置? 问题描述 NDK已经手工下载解包在本地: D:\Portable\android-ndk-r13b 每次创建支持C++项目时,都提示NDK没配置, ...
- 在android studio中集成javah, ndk-build进行JNI开发
最近在搞一个android上控制LED灯闪烁的功能,用到了串口编程,搜索了一下,发现Google发布了一个demo,android-serialport-api.有现成的代码和APK,要想自己改JNI ...
- Android studio 中的配置编译错误总结
1.编译Andorid 工程的时候,有时候出现gradle 报下面的错误. Error:(1, 0) Cause: com/android/build/gradle/LibraryPlugin : U ...
- 禁用android studio自身的ndk编译disable automatic ndk-build call
1,让studio不自动编译jni文件,而是我们手动通过ndk-build编译 打开工程下面的app文件夹, 找到build.gradle 添加如下: defaultConfig { ...
- 关于Android Studio中使用jni进行opencv配置开发环境的要素秘诀
使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找不到教程,大多都是eclipse下使用mk文件的方法,找不到 ...
- Android Studio中由于gradle插件版本和gradle版本对应关系导致的编译失败的问题
今天在Android Studio中导入新项目,import之后编译报错,报错信息基本都是和版本相关,查询gradle版本相关知识,了解到gradle插件版本和gradle版本有相应的匹配关系,对应如 ...
- Android如何使用so文件和Android studio中导入so
Android中使用so文件: 做一个PDF阅读的功能,找到一个开源的库,mupdf.下载的是网上编译好的so库,导入到自己项目中的时候一直报错Java.lang.UnsatisfiedLinkErr ...
- Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError
解决Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError 表示我们不编译jni代码,直接从libs里面复制so库 文件路径:app\buil ...
随机推荐
- Android--持久化技术
1.Android中的持久化技术主要有三种: 1)文件存储: 2)SharedPreference存储: 3)数据库存储(SQLite);2.文件存储: 1)Context 类中提供了一个 openF ...
- 盘点国内网站常用的一些 CDN 公共库加速服务
CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一 般的CDN公共库都会包含全球所有最流行的开源JavaScri ...
- [Xamarin] 使用LayoutInflater.Inflate載入預先設計好的Layout並使用 (转帖)
開發的時候,一定會把一些東西設計成元件,並且可以多次使用,今天紀錄一篇比較簡單的方法,可以載入事先做好的Layout 並且給予事件 介紹一下範例: Main.axml: <?xml versio ...
- 微软BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
[公告]本博客于2015年10月起不再更新 新博客文章主要发表在商业智能BI社区: http://www.flybi.net/blog/biwork 博客地图自动分类 文章目录方便更好的导航,阅读文章 ...
- linux 进程监控
linux 进程监控 supervise Supervise是daemontools的一个工具,可以用来监控管理unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程 ...
- C语言中的内存分配与释放
C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...
- [Java Web] 4、JavaScript 简单例子(高手略过)
内容概览: JavaScript简介 JavaScript的基本语法 JavaScript的基本应用 JavaScript的事件处理 window对象的使用 JavaScript简介: JavaScr ...
- [ACM_图论] ZOJ 3708 [Density of Power Network 线路密度,a->b=b->a去重]
The vast power system is the most complicated man-made system and the greatest engineering innovatio ...
- [游戏模版8] Win32 透明贴图
>_<:The same with previous introduction. In the InitInstance fanction make a little change: &g ...
- mvc项目问题清单以及解决方法
项目开发中遇到的一些问题以及解决方法. 1. 脚本相关 mvc中RemoteAttribute使用,在IE浏览器下面会将结果缓存起来(304).因为IE浏览器判断Url的链接参数都没有变化,所以直接返 ...