原文来自安卓教程网android.662p.com,转载时请注明文章的来源:http://android.662p.com/thread-5245-1-1.html
[概述]
NDK开发中, 最常见的脚本式语言应该就是 GLSL(OpenGL Shading Language) , 此类语言(一般情况下)不能以单个代码文件形式编写(并不以文件形式直接参与编译), 而是需要先以字符串形式完成编码, 然后通过开发语言接口的调用来完成工作. 就这种形式的编码, 个人是挺不喜欢的, 一来不易书写, 容易笔误, 二来不易阅读.
下面以GLSL为例.
[常规方法]
余不赘言, 直接上代码
// 定义GLSL
const char *demo_glsl =
"// TODO 定义变量1"
"// TODO 定义变量2"
"// TODO 定义变量3"
"void main(void) {"
" // TODO 进行运算"
"}";
// TODO 将 GLSL 输入到 GL 的接口
[改进方法]
[ol]
新建.glsl文件, 并以C/C++形式编辑, 勿需以字符串形式编辑, 见Snippet-1;
编辑Android.mk, 主要是通过sh脚本来重新输出.glsl, 并以.glslh作为后缀名, 见Snippet-2;
在主要代码里通过include来调用.glslh, 见Snippet-3.
[/ol]
// Snippet-1
// demo.glsl
// TODO 定义变量1
// TODO 定义变量2
// TODO 定义变量3
void main(void) {
// TODO 进行运算
} // Snippet-2
// Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(shell $(LOCAL_PATH)/prebuild.sh demo.glsl $(LOCAL_PATH) $(LOCAL_PATH))
//--- END OF Android.mk ---
// prebuild.sh
#!/bin/sh
mkdir -p $3
cat $2/$1 | sed -e 's|^.*$|"&\\n"|' > $3/$1h
//--- END OF prebuild.sh --- // Snippet-3
// demo.cpp
// 定义GLSL
const char demo_glsl={
#include "demo.glslh"
};
[最后的话]
从本质上来讲, 两种方法其实是一致的, 只不过是修改了输入的形式. 记得经典Objective-C(橙子)的那本书有一章就讲过: 通过间接的方法, 任何事情都可以完成. 或许会有人觉得这是多此一举, 但我们从另外一个角度来看的话, 或许是一件提高工作效率的事情, 尤其是在当下辅助工具颇丰的环境下, 比如语法高亮标记工具. 当然这种方法不只限于GLSL, 只要你想.
详细说明:http://android.662p.com/thread-5245-1-1.html