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 ...
随机推荐
- C++ set使用
C++ set使用 实际上c++ STL中的set是的实现和C++ STL中的map的实现的底层数据结构是一样的,如果我们不在考虑红黑树中的卫星数据,而只是关键字,那么同样不允许key值得重复,那么就 ...
- 对于C++窗口编译一闪而过的解决方法 (DEV CPP下)
对于C++窗口编译一闪而过的解决方法 首先来看一个简单的程序(编译环境为 DEV C++.): #include <iostream> int main() { std:: ...
- day4----json的简单实用
json官方说明参见:http://json.org/ Python操作json的标准api库参考:http://docs.python.org/library/json.html 重要函数 编码:把 ...
- JAVA对象转化JSON出现死循环问题
主要是解决JSON因Hibernate映射生成的集合的转化出现的死循环问题. 这个方法很重要 public String ajaxJsonByObjectDirecdt(Object obj, Str ...
- pmcyg 1.0 发布,Cygwin 安装包创建工具
pmcyg 1.0 改进包列表中对 UTF-8 的支持. pmcyg是一种工具来创建自定义集合的Cygwin包 连同Cygwin安装程序.这使得创建独立的分布而无需镜整个组Cygwin包.例如,它可以 ...
- ASP.NET MVC 4源码分析之如何定位控制器
利用少有的空余时间,详细的浏览了下ASP.NET MVC 4的源代码.照着之前的步伐继续前进(虽然博客园已经存在很多大牛对MVC源码分析的博客,但是从个人出发,还是希望自己能够摸索出这些).首先有一个 ...
- JS学习笔记10_Ajax
1.Ajax概述 Asynchronous JavaScript + XML,支持js与服务器通信.在不unload页面的前提下从服务器获取新数据,以实现更好的用户体验(与传统的单击-等待交互不同的体 ...
- 体验CoreCLR的stack unwinding特性在Linux/Mac上的初步实现
有了stack unwinding特性,才能在.NET程序中获取调用堆栈(call stack)信息,才能在异常时显示调用堆栈信息.这个特性之前只在Windows上有实现,Linux/Mac上的实现最 ...
- 作业七:团队项目——Alpha版本冲刺阶段-01
昨天进展:准备开发环境,安装软件. 今天安排:软件框架设计. 小组一共三人,陈芝航因家里有事,与我们进行了QQ视屏会议.
- 简单SQL分页
Select * From ( Select Row_Number() Over(Order By 表1.CreateTime desc) as rowId, 表1.Alumn ...