Long Luo's Life Notes

每一天都是奇迹

By Long Luo

昨天在开发一个项目时,在Android Studio中编译时,gradle编译之后出现了如下错误:

1
2
Error:Execution failed for task ':samples-simplevideowidget:processDebugResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'E:\Android\SDK\build-tools\23.0.1\aapt.exe'' finished with non-zero exit value 1

首先看到这个错误之后,因为移植的代码在之前的eclipse编译时OK的,所以先检查了下Android Studio项目中资源,代码有无提示的错误,经过确认没有之后,将错误信息在Google中搜索。

经过搜索之后,在StackOverflow和CSDN上发现有很多人遇到了这个错误,不过解决方法却各不相同。有的建议Clean然后Rebuild,有的建议修改使用内存,有的说是代码问题,也有的说是资源问题,比如本来是jpg图片,文件后缀却是png也会导致问题…

我按照以上方案一一检查,还是未能解决,于是只能自己动手排查原因了!

定位错误点

在项目root路径,命令行输入:

1
gradlew processDebugResources --debug

然后项目开始编译,屏幕上输出大量编译Log信息,从Log中找到了输出的出错信息:

1
2
3
4
5
6
org.gradle.process.internal.DefaultExecHandle] Changing state to: FAILED
org.gradle.process.internal.DefaultExecHandle] Process 'command 'E:\Android\SDK\build-tools\23.0.1\aapt.exe'' finished with exit value 1 (state: FAILED)
org.gradle.api.Project] Unknown source file : ERROR: In <declare-styleable> ListItemLinearLayout, unable to find attribute singleLine

org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':samples-simplevideowidget:processDebugResources'
E] [class org.gradle.TaskExecutionLogger] :samples-simplevideowidget:processDebugResources FAILED

从上述Log信息,我们可知出错点是ERROR: In <declare-styleable> ListItemLinearLayout, unable to find attribute singleLine,那么肯定是attrs文件的ListItemLinearLayoutstyleable出错了。

错误原因

经过上述分析,我们进入attrs.xml文件,找到ListItemLinearLayout,如下所示:

1
2
3
<declare-styleable name="ListItemLinearLayout">
<attr name="singleLine" />
<attr name="titleSize" format="dimension" />

可以看出singleLine没有对应的format属性,确定singleLine没有在代码中使用之后,将此属性删掉。

重新编译之后,问题解决。

Completed by Long Luo at 2016-04-09 00:36 @Shenzhen, China.

By Long Luo

自从2013年建了第一个个人网站(博客搭建,传送门:如何一步一步建立一个属于你自己的个人网站? ),折腾了好几个博客系统。

第一个网站购买了VPS,使用LNMP架构,博客系统使用Wordpress。使用了半年左右,觉得Wordpress太重了,看到了其他技术博主使用 Octopress ,简洁,于是切换到Octopress。

最近一次则是Hexo ,非常简洁,而且很快,于是很快将个人网站切换到Hexo。

目前使用Hexo+Next主题,非常简洁。

这里记录一些Hexo

最开始是讲述了如何利用Github Pages建立一个属于自己的静态博客,下面这篇文章主要讲的是hexo的常见指令及说明,定位于Hexo的入门指南

Hexo

Hexo文档

Hexo手册文档: https://hexo.io/zh-cn/docs/

Hexo命令

命令行中输入:

1
$hexo help

列出了Hexo常用命令:

Commands:
  clean     Removed generated files and cache.
  config    Get or set configurations.
  deploy    Deploy your website.
  generate  Generate static files.
  help      Get help on a command. 查看帮助信息
  init      Create a new Hexo folder. init [文件夹名]: 创建一个hexo项目,不指定文件夹名,则在当前目录创建
  list      List the information of the site
  migrate   Migrate your site from other system to Hexo.
  new       Create a new post.
  publish   Moves a draft post from _drafts to _posts folder.
  render    Render files with renderer plugins.
  server    Start the server.
  version   Display version information. 查看hexo的版本

Global Options:
  --config  Specify config file instead of using _config.yml config-path:指定配置文件,代替默认的_config.yml
  --cwd     Specify the CWD cwd-path:自定义当前工作目录
  --debug   Display all verbose messages in the terminal 调试模式,输出所有日志信息
  --draft   Display draft posts
  --safe    Disable all plugins and scripts 安全模式,禁用所有的插件和脚本
  --silent  Hide output on console 无日志输出模式

Hexo常用命令也可以使用以下缩写:

1
2
3
4
hexo n == hexo new
hexo g == hexo generate
hexo s == hexo server
hexo d == hexo deploy

清除生成内容

1
$ hexo clean

执行此操作会删除 public 文件夹中的内容。 以上就是经常使用的命令。

一键三连:

1
2
hexo clean && hexo g -d
hexo clean && hexo g && hexo s --debug
阅读全文 »

By Long Luo

今天下午去 深圳玛格丽特音乐文化教育中心 以地板价试听了一节钢琴课,学到了很多东西,再结合自己的一些思考,在此简单记录下来。

对于成人学钢琴来说,一大问题是时间有限,如果你是个上班族,不可能有很多时间让你去学习和练习,所以你得用脑子去学习。美女老师说,你的脑子里得时时刻刻有钢琴这东西。这种潜意思的学习,你可以在脑海中想象去弹琴,多思考,多分析,多总结,带着疑问去学习,这样才会学得快。

学习一样新东西,无法就是学习,模仿,练习,实践。掌握了正确的学习方法,可以达到事半功倍的效果。

阅读全文 »

By Long Luo

一、

冬天的太阳,比起夏天的太阳,大了很多倍,从山顶探出头来,漏出一片红色的光,落在结了一层白色的霜的屋顶上。这个时候就是吃完饭准备走去学校的时候了。

抬头一看,只有一片蓝色,云朵都藏起来了。

四周没有多少声息,只听到一些叽叽喳喳的鸟叫声。那时的我,穿的严严实实,挑着有光的路走。红色的光在手背停留了许久许久,但就像火柴的火一样,烤不热这一团已经发红发麻的大冰块。直到上完前3节课,冰块才完全融化,所以小学课本里的笔记有的地方一片歪歪扭扭,那就说明是在上午前3节课记下的。

路边的田里覆盖着一层稀稀疏疏的白色,偶尔可以看见几片青色的野草叶子。一排排白色的稻茬排列在田间,像阅兵的方队,等候着我们的检阅。

我们看着前方,太阳已经离开山顶几丈高了,照亮了更远处的村落和山坡。模模糊糊的远方,有更高的山,其实也只是几缕山的形状。我不知道何时能走到那山脚,看看那山里面到底是什么?

当太阳已经挂在学校低矮的屋顶时,我们的心已经蠢蠢欲动了。随着老师的一声下课,我们一边站起来说,“老师再见”,另一边两只手已经抓牢了课桌里的书包。不同于早上的慢慢吞吞,下午我们的精力异常的旺盛,一路追着跑着,跑累了就停下来走一走。

太阳仍然在离地很近很近的高处挂着,将那一片的云从白色烧成通红。不同于八九月的傍晚,尤其是在下午下了一阵雨以后,那时候有很多的云,被烧成了一片红,将大地镀上了一层金色。云彩也飞快的移动着,变化成不同的形状。多年之后我才在课本里知道这叫火烧云。

太阳仿佛在和我们玩捉迷藏,将自己藏在山里面,只露出了一个头偷偷地看着我们。我们又努力向前跑着,终于又看见它了,不过一小会,它又藏在更远处的山顶。我想山那边会是什么样子?也有像我一样的孩子么?这个世界上会有另外一个我吗?

Created by Long Luo at 2016.02.07 @Jiangxi, China.

By Long Luo

1
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk clean
1
2
3
4
5
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-19.
[armeabi-v7a] Clean : hello-exe [armeabi-v7a]
[arm64-v8a] Clean : hello-exe [arm64-v8a]
[x86] Clean : hello-exe [x86]
[x86_64] Clean : hello-exe [x86_64]

hello.c

1
2
3
4
5
6
#include <stdio.h>

int main(int argc, char ** argv){
printf("Hello world from NDK executable!\n");
return 0;
}

Android.mk

1
2
3
4
5
6
7
8
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-exe
LOCAL_SRC_FILES := hello.c

include $(BUILD_EXECUTABLE)

Application.mk

1
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk
``


```txt
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-19.
[armeabi-v7a] Compile thumb : hello-exe <= hello.c
[armeabi-v7a] Executable : hello-exe
[armeabi-v7a] Install : hello-exe => libs/armeabi-v7a/hello-exe
[arm64-v8a] Compile : hello-exe <= hello.c
[arm64-v8a] Executable : hello-exe
[arm64-v8a] Install : hello-exe => libs/arm64-v8a/hello-exe
[x86] Compile : hello-exe <= hello.c
[x86] Executable : hello-exe
[x86] Install : hello-exe => libs/x86/hello-exe
[x86_64] Compile : hello-exe <= hello.c
[x86_64] Executable : hello-exe
[x86_64] Install : hello-exe => libs/x86_64/hello-exe

Android.mk

1
2
3
4
5
6
7
8
9
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni

LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Application.mk

1
2
APP_PLATFORM := android-21
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_me_longluo_hellojni_MainActivity_getStringFromJNI(JNIEnv *env, jobject thiz) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}


JNIEXPORT jint JNICALL
Java_me_longluo_hellojni_MainActivity_getIntSqure(JNIEnv* env, jobject obj, jint value) {
return value * value;
}
1
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-19.
[armeabi-v7a] Compile thumb : hello-jni <= hello-jni.c
[armeabi-v7a] SharedLibrary : libhello-jni.so
[armeabi-v7a] Install : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
[arm64-v8a] Compile : hello-jni <= hello-jni.c
[arm64-v8a] SharedLibrary : libhello-jni.so
[arm64-v8a] Install : libhello-jni.so => libs/arm64-v8a/libhello-jni.so
[x86] Compile : hello-jni <= hello-jni.c
[x86] SharedLibrary : libhello-jni.so
[x86] Install : libhello-jni.so => libs/x86/libhello-jni.so
[x86_64] Compile : hello-jni <= hello-jni.c
[x86_64] SharedLibrary : libhello-jni.so
[x86_64] Install : libhello-jni.so => libs/x86_64/libhello-jni.so

参考文献

  1. NDK 使用入门
  2. ndk-build 脚本
  3. Android.mk
  4. Application.mk
  5. 使用预构建库

https://corochann.com/build-executable-file-with-android-ndk-after-lollipop-android-api-21-252/

https://stackoverflow.com/questions/24818902/running-a-native-library-on-android-l-error-only-position-independent-executab

https://saurabhsharma123k.blogspot.com/2017/02/generate-so-file-by-using-ndk-and-use.html

Compiling for Android with Android NDK and ndk-build

0%