导航:首页 > 源码编译 > 动态编译app

动态编译app

发布时间:2022-01-17 20:36:54

A. ndk-android NDk 怎么编译时动态链接第三方so库,有头文件

问题描述:Android如何调用第三方SO库;
已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;
已了解解决方案:
1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;
2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;
求解:
1.上面两种方案是否可行?不可行的话存在什么问题?
2.两种方案有什么区别?为什么网上大部都是用的第二种方案?
3.只有一个*.so文件,并提供了详细的接口说明,是否可在ANDROID中使用它?

首先要看这个SO是不是JNI规范的SO,比如有没有返回JNI不直接支持的类型。也就是说这个SO是不是可以直接当作JNI来调用。如果答案是否定的,你只能选第二个方案。

如果答案是肯定的,还要看你是不是希望这个SO的库直接暴露给JAVA层,如果答案是否定的,你只能选第二个方案,比如你本身也是一个库的提供者。

一般如果你只有SO,就说明这个是别人提供给你的,你可以要求对方给你提供配套的JAVA调用文件。

1、这个要看这个SO是不是符合JNI调用的规范。还要看你自己的意愿。
2、因为第二种方法最灵活,各种情况都可以实现。
3、可以

看能不能直接从JAVA调用的最简单的方法就是看SO里的函数名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己写一个配套的JAVA文件,注意一下SO函数名和JAVA函数名的转换规则,或者向SO提供方索要;
不是的话就选第二种方案吧。

1、检查所需文件是否齐全
使用第三方动态库,应该至少有2个文件,一个是动态库(.so),另一个是包含
动态库API声明的头文件(.h)
2、封装原动态库
原动态库文件不包含jni接口需要的信息,所以我们需要对其进行封装,所以我
们的需求是:将libadd.so 里面的API封装成带jni接口的动态
3、编写库的封装函数libaddjni.c
根据前面生成的com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用
来生成libaddjni.so

Android中集成第三方软件包(.jar, .so)

Android中可能会用到第三方的软件包,这包括Java包.jar和Native包.so。jar包既可通过Eclipse开发环境集成,也可通过编译源码集成,看你的工作环境。

假定自己开发的程序为MyMaps,需要用到BaiMaps的库,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。

一、Eclipse中集成第三方jar包及.so动态库

MyMaps工程下创建目录libs以及libs/armeabi,把mapapi.jar放在的libs/目录下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。

Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步骤:

1. 右击工程,选择Properties;
2. Java Build Path,选择Libraries;
3. Libraries页面点击右面按钮“Add Library…”;
4. 选择“User Library”,点击“Next”;
5. 点击“User Libraries”按钮;
6. 在弹出界面中,点击“New…”;
7. 输入“User library name”,点击“OK”确认;
8. 返回之后,选择刚刚创建的User library,右面点击“AddJARs”;
9. 选择MyMaps/libs/下的mapapi.jar;
10. 确认,返回。

这样,编译之后,该jar包就会被打进MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
程序运行过程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,加载动态库时系统会从程序的该lib/目录下查找.so库。

二、源码中集成第三方集成jar包及.so动态库

Android源码中MyMaps放在packages/apps下。MyMaps下创建目录libs以及libs/armeabi,并把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

2.1 修改Android.mk文件

Android.mk文件如下:

[plain] view plain
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := libmapapi

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := MyMaps

include $(BUILD_PACKAGE)

##################################################
include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jar
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)

# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))

1 集成jar包
LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar库的规则,格式:别名:jar文件路径。注意:别名一定要与LOCAL_STATIC_JAVA_LIBRARIES里所取的别名一致,且不含.jar;jar文件路径一定要是真实的存放第三方jar包的路径。
编译用BUILD_MULTI_PREBUILT。
2 集成.so动态库
LOCAL_PREBUILT_LIBS指定prebuilt so的规则,格式:别名:so文件路径。注意:别名一般不可改变,特别是第三方jar包使用.so库的情况,且不含.so;so文件路径一定要是真实的存放第三方so文件的路径。
编译拷贝用BUILD_MULTI_PREBUILT。

2.2 加入到GRANDFATHERED_USER_MODULES

在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中

[plain] view plain
GRANDFATHERED_USER_MODULES += \
… \
libBMapApiEngine_v1_3_1

user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推荐修改$(TARGET_DEVICE_DIR)下的。

2.3 编译结果

MyMaps.apk编译生成在out/target/proct/<YourProct>/system/app/下;
libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,这也是系统加载动态库时搜索的路径。

B. 如何制作app软件

随着移动手机的普及,移动APP应用软件也流行起来。“启汇网络”市场部通过调查得出一组数据:20%左右的企业已经拥有或者正在开发自己的app应用软件,60%左右的公司已经把开发app软件列入近期公司发展项目中。可以看出,大部分公司和站长都有想法把自己的网站制作成app软件,跟紧潮流步伐。但app开发涉及到的技术比较专业,开发语言要想熟悉掌握也并非一件易事。那么,在技术还未过关的情况下,如何制作app应用软件呢?
接下来,我将给大家介绍一些适合制作简单app的软件,让各位在未掌握app开发语言情况下,依然能制作出属于自己的app应用软件。
一:Appmakr
AppMakr是一个可以让你在几分钟之内创建应用程序的一种服务,无需编码能力。使用该工具,你可以创建iPhone和Android应用。还有一些可供选择的功能,包括将网站连接到你的应用程序、HTML5功能、推送通知和广告支持。通过AppMaker账户,你可以创建无限数量的应用程序。
目前Appmakr是国外比较流行的应用生成工具,在国内也享有一定知名度。
二:AppCan
AppCan属于移动应用开发平台,应用引擎支持Hybrid
App的开发和运行。并且着重解决了基于HTML5的移动应用目前"不流畅"和"体验差"的问题。使用AppCan应用引擎提供的Native交互能力,可以让HTML5开发的移动应用基本接近Native
App的体验。
与Phonegap支持单一webview使用div为单位开发移动应用不同。AppCan支持多窗口机制,让开发者可以像最传统的网页开发一样,通过页面链接的方式灵活的开发移动应用。基于这种机制,开发者可以开发出大型的移动应用,而不是只能开发简易类型的移动应用。
三:appBook
appBook平台是多平台移动应用制作工具,可以广泛用于书籍制作,个人杂志发行,宣传手册,支持iPad、iPhone、Andriod等平台,不支持pc平台。真正做到了一次编译多平台发布。目前appbook平台有:iebook平台、及、appbook应用制作平台.
曾经我也适用用软件制作APP,目的是达到了,但做出来的app比较生硬。后来我和启汇网络(广州一家比较专业的APP开发公司)技术总监Daniel聊起app开发,Daniel认为:要做好app开发,必须要有核心的app开发技术,有经验的app开发团队,才能做好满意的app应用软件。
真正要做好一个APP,也要掌握一定的app开发技术才是王道!
Tag:如何制作app,app移动应用,app外包公司,app客户端制作

C. 求解 java动态编译找不到类,往各位大虾指导

参照网上其他童鞋的例子与介绍,修改了一下:
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

/**
* 动态编译Java 源文件
*
* @author shenshouer
*
*/
public class CompilerTest {

public static void main(String[] args) throws Exception {
String source = "public class Main { " + "public static void main(String[]args) {"
+ "System.out.println(\"Hello World!\");" + "} " + "}";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject("Main",
source);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

// 获取编译类根路径,不然会报找不到类的错误
String path = Class.class.getClass().getResource("/").getPath();
Iterable< String> options = Arrays.asList("-d", path);

// 增加options参数
// CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);

boolean result = task.call();

if (result) {
System.out.println("编译成功。");

ClassLoader loader = CompilerTest.class.getClassLoader();
try {
Class<?> clazz = loader.loadClass("Main");
Method method = clazz.getMethod("main", String[].class);
// 修改调用参数,不然会报参数个数不对
// Object value = method.invoke(null, new Object[] {});
Object value = method.invoke(null, new Object[] {new String[]{}});
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}

static class StringSourceJavaObject extends SimpleJavaFileObject {

private String content = null;

public StringSourceJavaObject(String name, String content) throws URISyntaxException {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.content = content;
}

public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}
}

D. 易语言没Widows动态链接库怎么编译生成安装软件。

的意见作了一些修改。

什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源。程序的时间效率是指运行速度,空间效率是指程序占用内存或者外存的状况。另外程序的效率我们也可以分为全局效率和局部效率。全局效率是指站在整个系统的角度上考虑的效率,局部效率是指站在模块或函数角度上考虑的效率。

1. 使用整数和长整数

提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将短整数型、小数型和双精度小数型的变量替换为整数(Integer)或长整数(Long)类型的变量,因为易语言处理整数和长整数的能力远远高于处理其它几种数据类型。

在大多数情况下,程序员选择使用小数型或双精度小数型的原因是因为它们能够保存小数。但是小数也可以保存在整数类型的变量中。例如程序中约定有三位小数,那么只需要将保存在整数型变量中的数值除以1000就可以得到结果。根据我的经验,使用整数和长整数替代短整数型、小数型和双精度小数型后,代码的运行速度可以提高将近10倍。 但是我们也不要老是强调使用使用整数和长整数,因为在程序中数据类型的定义还牵涉一个关键的问题,就是数据的安全,频繁而无规范地定义 数据类型会使算法出现漏洞,是数据的安全和临界判断有问题.对财务和工程计算而言,小数点的精度是很敏感的数据,只能用双精度数据来规范.另外, 换成整型也会导致程序可读性急剧下降.

2. 避免使用通用型数据

通用型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节。通常使用通用型变量的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。

3. 尽量避免使用属性

在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的:

容器名: 数值 类型:整数型容器名: 容器 类型:整数型 计次循环首(7,容器) 文本1.内容 = 文本1.内容 + #换行符 + 到文本((数值×容器))计次循环尾()

下面这段代码的执行速度是上面代码的20倍。

容器名: 数值 类型:整数型容器名: 容器 类型:整数型容器名: 文本 类型:文本型

文本 = 文本1.内容 计次循环首(7,容器) 文本 = 文本 + #换行符 + 到文本((数值×容器))计次循环尾()文本1.内容 = 文本

另外要注意,这个涉及一个编程思路, 用属性当变量的作法大多数情况可以简化算法。所以有时候也不能一味强调用变量代替属性。

6. 避免调用很短的子程序

调用只有几行代码的子程序也是不经济的--调用子程序所花费的时间或许比执行子程序中的代码需要更长的时间。在这种情况下,你可以把子程序中的代码拷贝到原来调用子程序的地方。 但是有时候小的子程序可能会被调用很多次而不是只有两三次,这时就应该调用它。

7. 减少对子对象的引用

在易语言中,通过使用.来实现对象的引用。例如:

窗口1.编辑框1.内容

在上面的例子中,程序引用了两个对象:窗口1和编辑框1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。我的“多媒体模块”就有这个缺点。

8. 检查文本型数据是否为空

大多数易语言用户在检查文本型数据是否为空时会使用下面的方法:

如果 (文本1.内容 = "" ) 注释: 执行操作 结束如果

很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法:

如果 (到数值(文本1.内容) = 0 ) 注释: 执行操作 结束如果

另一个不同的意见是:问题在于当文本字串为 "ABC"之类的非数值型时, 到数值("ABC")=0并不表示为空。文本比较的效率并不低,在底层算法中,一般会直接比较长度才会继续比较内容。

9. 使用数组,而不是多个变量

当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在易语言中,数组是最高效的数据结构之一。

10. 尽量使用动态数组,而不是静态数组

使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。

11. 销毁对象

无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多用户对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:关闭数据库:关闭(数据库名称)、全部关闭(),关闭打开(播放)的文件,关闭载入的图片等。 中止程序执行时应该要关闭打开的文件(包括数据库文件、图片文件等),但是窗口销毁对销毁窗口及窗口单元来说是自动的,已足够做释放用,在窗口内最好不要随意销毁窗口单元,可能会导致程序运行中的潜在的单元数据访问而崩溃.只有在图形buffer情况才需要经常销毁。

12. 尽量使用内部子程序,减少易模块的数量

因为从易语言连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用接口函数的时候,都会浪费大量的系统资源。 另外只有在易模块中的接口函数或变量被调用时,易语言才将易模块加载到内存中;当易语言应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,易语言就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,易语言会进行多次加载操作,代码的效率会降低。

13. 使用对象数组

当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个图片框,每个图片框都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个图片框,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。 也有人认为两者从逻辑上看效率应该差不多。

14. 使用窗口单元“移动”方法

在改变对象的位置时,有些用户喜欢使用“宽度”、“高度”、“顶边”和“左边”属性。例如:

按钮1.宽度 = 100 按钮1.高度 = 100 按钮1.顶边 = 0 按钮1.左边 = 0

实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用Move方法:

按钮1.移动(0,0,100,100)

15. 减少图片的使用

图片将占用大量内存,而且处理图片也需要占用很多CPU资源。在软件中,如果可能的话,可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。 但是如果为了优化程序界面,使用图形换来的好处可能远胜节约下的资源,否则就不会有XP,也不会有游戏的进步了。

16. 编译优化

易语言的程序编译有三个选项:“编译”、“独立编译”、“编译生成安装软件”。优先使用的次序应该是“编译生成安装软件”、“编译”、“独立编译”,因为“独立编译”会将易语言系统中所有的支持库都编译进去,而“编译生成安装软件”只选择程序中必要的支持库编译。要脱离易语言环境也可以运行,就不要使用“编译”而应用“编译生成安装软件”或“独立编译”。 总结:执行效率和程序可读性永远是对矛盾 ,两者应该通盘考虑;资源占用和程序易用性永远是对矛盾,两者也应该通盘考虑。基于此,下面探讨一些提高程序的效率的规则。

不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率。

以提高程序的全局效率为主,提高局部效率为辅。

在优化程序的效率时,应当先找出限制效率的“瓶颈”,不要在无关紧要之处优化。

先优化数据结构和算法,再优化执行代码。先考虑某功能是否可以用函数(命令)来实现,如果找不到这样的函数,再考虑用其他代码实现。

有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷。例如多花费一些内存来提高性能。

不要在什么时候都只追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。

E. openssl怎么编译成动态库

1、静态编译
./Configure linux-elf-arm -DB_ENDIAN linux:'armeb-linux-gcc -mbig-endian' --prefix=$(pwd)/OpenSSL
a、 将openssl-0.9.8d/crypto/bio/bss_file.c中以下代码注释掉
//#ifndef _FILE_OFFSET_BITS
//#define _FILE_OFFSET_BITS 64
//#endif
#endif
b、 报错没有timeb.h时,在报错的.c文件中#undef TIMEB
c、 去掉openssl顶层Makefile中“build_all:”后面的 build_app build_test (我们要的只是两个静态库libcrypto.a和libssl.a),并去掉”DIRS=”后面的app和tests。
make && make install

2、动态库
1.config:
#config no-asm --prefix=../OpenSSL
2.改Makefile
1) CC= gcc 改成 CC = armeb-linux-gcc;
2) 删除 CFLAG= 中的 “-march=pentium”;
3) AR=ar $(ARFLAGS) r 改为 AR=armeb-linux-ar $(ARFLAGS) r;
4) ARD=ar $(ARFLAGS) d 改为 ARD=armeb-linux-ar $(ARFLAGS) d;
5)RANLIB= /usr/bin/ranlib 改为 RANLIB= armeb-linux-ranlib;
3.编译
#make
#make install

F. viewbag 找不到编译动态表达式

1 删除C:Users{your computer name}AppDataLocalTempTemporary ASP.NET Files 该目录下的临时文件(亲试无效)
2 把配置文件改了也无无效.
好奇怪,就某个项目出现这个情况. 其他项目正常

G. 如何让编译器架构Android.mk动态

Android.mk文件用来告知NDK Build 系统关于Source的信息。 Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次。
所以,请尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。

Android.mk文件语法允许我们将Source打包成一个"moles". moles可以是:
静态库
动态库。

只有动态库可以被 install/到应用程序包(APK). 静态库则可以被链接入动态库。
可以在一个Android.mk中定义一个或多个moles. 也可以将同一份source 加进多个moles.

Build System帮我们处理了很多细节而不需要我们再关心。例如:你不需要在Android.mk中列出头文件和外部依赖文件。
NDK Build System自动帮我们提供这些信息。这也意味着,当用户升级NDK后,你将可以受益于新的toolchain/platform而不必再去修改Android.mk.

1. Android.mk语法:
首先看一个最简单的Android.mk的例子:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

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

include $(BUILD_SHARED_LIBRARY)
讲解如下:
LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir则由Build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := hello-jni
LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。
不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。
它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY:编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库
BUILD_EXECUTABLE:编译为Native C可执行程序

2. NDK Build System变量:
NDK Build System 保留以下变量名:
以LOCAL_ 为开头的
以PRIVATE_ ,NDK_ 或者APP_ 开头的名字。
小写字母名字:如my-dir

如果想要定义自己在Android.mk中使用的变量名,建议添加 MY_前缀。

2.1: NDK提供的变量:
此类GNU Make变量是NDK Build System在解析Android.mk之前就定义好了的。
2.1.1:CLEAR_VARS:

指向一个编译脚本。必须在新模块前包含之。
include $(CLEAR_VARS)
2.1.2:BUILD_SHARED_LIBRARY:
指向一个编译脚本,它收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。
并决定如何将你列出的Source编译成一个动态库。 注意,在包含此文件前,至少应该包含:LOCAL_MODULE and LOCAL_SRC_FILES 例如:
include $(BUILD_SHARED_LIBRARY)

2.1.3:BUILD_STATIC_LIBRARY:
与前面类似,它也指向一个编译脚本,
收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。
并决定如何将你列出的Source编译成一个静态库。 静态库不能够加入到Project 或者APK中。但它可以用来生成动态库。
LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRARIES将描述之。
include $(BUILD_STATIC_LIBRARY)

2.1.4: BUILD_EXECUTABLE:
与前面类似,它也指向一个编译脚本,收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。
并决定如何将你列出的Source编译成一个可执行Native程序。 include $(BUILD_EXECUTABLE)

2.1.5:PREBUILT_SHARED_LIBRARY:
把这个共享库声明为 “一个” 独立的模块。
指向一个build 脚本,用来指定一个预先编译好多动态库。 与BUILD_SHARED_LIBRARY and BUILD_STATIC_LIBRARY不同,
此时模块的LOCAL_SRC_FILES应该被指定为一个预先编译好的动态库,而非source file. LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt # 模块名
LOCAL_SRC_FILES := libfoo.so # 模块的文件路径(相对于 LOCAL_PATH)

include $(PREBUILT_SHARED_LIBRARY) # 注意这里不是 BUILD_SHARED_LIBRARY

这个共享库将被拷贝到 $PROJECT/obj/local 和 $PROJECT/libs/<abi> (stripped) 主要是用在将已经编译好的第三方库
使用在本Android Project中。为什么不直接将其COPY到libs/armabi目录呢?因为这样做缺陷很多。下一节再详细说明。

2.1.6: PREBUILT_STATIC_LIBRARY:预先编译的静态库。 同上。

2.1.7: TARGET_ARCH: 目标CPU架构名。如果为“arm” 则声称ARM兼容的指令。与CPU架构版本无关。

2.1.8: TARGET_PLATFORM: 目标的名字。

2.1.9:TARGET_ARCH_ABI
Name of the target CPU+ABI
armeabi For ARMv5TE armeabi-v7a
2.1.10:TARGET_ABI

2.2: NDK提供的功能宏:
GNUMake 提供的功能宏,只有通过类似: $(call function) 的方式来得到其值,它将返回文本化的信息。

2.2.1: my-dir: $(call my-dir):
返回最近一次include的Makefile的路径。通常返回Android.mk所在的路径。它用来作为Android.mk的开头来定义LOCAL_PATH. LOCAL_PATH := $(call my-dir)
请注意:返回的是最近一次include的Makefile的路径。所以在Include其它Makefile后,再调用$(call my-dir)会返回其它Android.mk 所在路径。 例如:
LOCAL_PATH := $(call my-dir) declare one mole include $(LOCAL_PATH)/foo/Android.mk LOCAL_PATH := $(call my-dir) declare another mole
则第二次返回的LOCAL_PATH为:$PATH/foo。 而非$PATH.

2.2.2: all-subdir-makefiles:
返回一个列表,包含'my-dir'中所有子目录中的Android.mk。
例如: 结构如下: sources/foo/Android.mk sources/foo/lib1/Android.mk sources/foo/lib2/Android.mk
在If sources/foo/Android.mk 中, include $(call all-subdir-makefiles) 那则自动include 了sources/foo/lib1/Android.mk and sources/foo/lib2/Android.mk。

2.2.3:this-makefile:
当前Makefile的路径。

2.2.4:parent-makefile:
返回include tree中父Makefile 路径。 也就是include 当前Makefile的Makefile Path。

2.2.5:import-mole:
允许寻找并inport其它moles到本Android.mk中来。 它会从NDK_MODULE_PATH寻找指定的模块名。 $(call import-mole,<name>)
2.3: 模块描述变量:
此类变量用来给Build System描述模块信息。在'include $(CLEAR_VARS)' 和 'include $(BUILD_XXXXX)'之间。必须定义此类变量。 include $(CLEAR_VARS) script用来清空这些变量。

include $(BUILD_XXXXX)收集和使用这些变量。

2.3.1: LOCAL_PATH:
这个值用来给定当前目录。必须在Android.mk的开是位置定义之。
例如: LOCAL_PATH := $(call my-dir) LOCAL_PATH不会被include $(CLEAR_VARS) 清理。

2.3.2: LOCAL_MODULE:
moles名。在include $(BUILD_XXXXX)之前,必须定义这个变量。此变量必须唯一且不能有空格。
通常,由此变量名决定最终生成的目标文件名。

2.3.3: LOCAL_MODULE_FILENAME:
可选。用来override LOCAL_MODULE. 即允许用户重新定义最终生成的目标文件名。 LOCAL_MODULE := foo-version-1 LOCAL_MODULE_FILENAME := libfoo
2.3.4:LOCAL_SRC_FILES:
为Build Moles而提供的Source 文件列表。不需要列出依赖文件。 注意:文件相对于LOCAL_PATH存放,
且可以提供相对路径。 例如: LOCAL_SRC_FILES := foo.c \ toto/bar.c
2.3.5: LOCAL_CPP_EXTENSION:
指出C++ 扩展名。(可选) LOCAL_CPP_EXTENSION := .cxx 从NDK R7后,可以写多个:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc

2.3.6:LOCAL_CPP_FEATURES:
可选。用来指定C++ features。 LOCAL_CPP_FEATURES := rtti
LOCAL_CPP_FEATURES := exceptions

2.3.7:LOCAL_C_INCLUDES:
一个可选的path列表。相对于NDK ROOT 目录。编译时,将会把这些目录附上。 LOCAL_C_INCLUDES := sources/foo LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
2.3.8: LOCAL_CFLAGS:
一个可选的设置,在编译C/C++ source 时添加如Flags。
用来附加编译选项。 注意:不要尝试在此处修改编译的优化选项和Debug等级。它会通过您Application.mk中的信息自动指定。
也可以指定include 目录通过:LOCAL_CFLAGS += -I<path>。 这个方法比使用LOCAL_C_INCLUDES要好。因为这样也可以被ndk-debug使用。

2.3.9: LOCAL_CXXFLAGS: LOCAL_CPPFLAGS的别名。
2.3.10: LOCAL_CPPFLAGS:
C++ Source 编译时添加的C Flags。这些Flags将出现在LOCAL_CFLAGS flags 的后面。

2.3.11: LOCAL_STATIC_LIBRARIES:
要链接到本模块的静态库list。(built with BUILD_STATIC_LIBRARY)

2.3.12: LOCAL_SHARED_LIBRARIES:
要链接到本模块的动态库。

2.3.13:LOCAL_WHOLE_STATIC_LIBRARIES:

静态库全链接。 不同于LOCAL_STATIC_LIBRARIES,类似于使用--whole-archive

2.3.14:LOCAL_LDLIBS:

linker flags。 可以用它来添加系统库。 如 -lz: LOCAL_LDLIBS := -lz

2.3.15: LOCAL_ALLOW_UNDEFINED_SYMBOLS:

2.3.16: LOCAL_ARM_MODE:
缺省模式下,ARM目标代码被编译为thumb模式。每个指令16位。如果指定此变量为:arm。 则指令为32位。 LOCAL_ARM_MODE := arm 其实也可以指定某一个或者某几个文件的ARM指令模式。
2.3.17: LOCAL_ARM_NEON:
设置为true时,会讲浮点编译成neon指令。这会极大地加快浮点运算(前提是硬件支持)
只有targeting 为 'armeabi-v7a'时才可以。

2.3.18:LOCAL_DISABLE_NO_EXECUTE:

2.3.19: LOCAL_EXPORT_CFLAGS:
定义这个变量用来记录C/C++编译器标志集合,
并且会被添加到其他任何以LOCAL_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES的模块的LOCAL_CFLAGS定义中 LOCAL_SRC_FILES := foo.c bar.c.arm
注意:此处NDK版本为NDK R7C.(不同NDK版本,ndk-build所产生的Makefile并不完全相同)

H. 100分求三菱plc编译和仿真软件(中文版),可以动态演示和操作!

已经把中文版GX simulator 和 GX-Developer 发到你有邮箱中,请查收。

I. 编程用那个软件好用

如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧!

方案一 Basic语言 & Visual Basic

优点
(1)Basic 简单易学,很容易上手。
(2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。
(3)众多的控件让编程变得象垒积木一样简单。
(4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。

缺点
(1)Visual Basic 不是真正的面向对象的开发文具。
(2)Visual Basic 的数据类型太少,而且不支持指针,这使得它的表达能力很有限。
(3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。

综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作品。对于那些把编程当做游戏的朋友来说,VB 是您最佳的选择。

方案二 Pascal语言 & Delphi

优点
(1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。
(2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。
(3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。
(4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。

缺点
Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。

综述: 方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。

方案三 C语言 & Visual C++

优点
(1)C语言灵活性好,效率高,可以接触到软件开发比较底层的东西。
(2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。
(3)VC是微软制作的产品,与操作系统的结合更加紧密。

缺点
对使用者的要求比较高,既要具备丰富的C语言编程经验,又要具有一定的WINDOWS编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。

综述: VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。

方案四 C++语言 & C++ Builder

优点
(1)C++语言的优点全部得以继承。
(2)完全的可是化。
(3)极强的兼容性,支持OWL、VCL和MFC三大类库。
(4)编译速度非常快。

缺点
由于推出的时间太短,关于它的各种资料还不太多。

综述:我认为C++ Builder 是最好的编程工具。它既保持了C++语言编程的优点,又做到了完全的可视化。

方案五 SQL语言 & Power Builder

对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,PowerBuilder也许是最好的数据库开发工具。各种各样的控件,功能强大的PowerBuilder语言都会帮助你开发出自己的数据库应用程序。

阅读全文

与动态编译app相关的资料

热点内容
如何对服务器取证 浏览:440
有什么系统像友价源码 浏览:570
圆柱弹簧压缩量 浏览:811
我的世界国际版为什么没法进去服务器 浏览:103
我的世界如何创造一个服务器地址 浏览:837
皮皮虾app怎么玩视频教程 浏览:253
python整型转化字符串 浏览:804
android数据共享方式 浏览:375
编译环境控制台 浏览:620
宁波欣达压缩机空气过滤器价位 浏览:665
幂函数的运算法则总结 浏览:138
方舟自己的服务器怎么搞蓝图 浏览:915
校园网怎么加密ip 浏览:786
kotlin可以编译双端吗 浏览:327
哪个幼儿识字app不要钱 浏览:802
压缩软件的作用 浏览:31
猴子网游app安全吗怎么扫码 浏览:221
哪些系统盘文件夹大 浏览:341
pdf朗读软件手机 浏览:226
ug编程实例教程 浏览:987