JNI——AM和 MakeFile

AM ● -a: 指定Intent action, 实现原理Intent.setAction(); ● -n: 指定组件名,格式为{包名}/.{主Activity名},实现原理Intent.setComponent(); ● -d: 指定Intent data URI ● -t: 指定Intent MIME Type ● -c[-c] ...]:指定Intent category,实现原理Intent.addCategory() ● -p: 指定包名,实现原理Intent.setPackage(); ● -f: 添加flags,实现原理Intent.setFlags(int ),紧接着的参数必须是int型;



  基本类型

参数-e/-es-esn-ez-ei-el-ef-eu-ecn类型String(String) null boolean int long float uri component

比如参数es是Extra String首字母简称,实例:

intent.putExtra("website","website gityuan.com")

am start -n com.mi.app/.MainActivity -es website gityuan.com

比如参数efal,是Extra float Array List首字母简称,多个value值之间以逗号隔开,实例:

am start -n com.mi.app/.MainActivity -efal nums 1.2,2.2

此处-es website gityuan.com,等价于Intent.putExtra(“website”, “gityuan.com”);

在JNI种使用execlp方法去启动一个activity。

execlp("am","am","start","-a","android.intent.action.VIEW","-d"

,"http://www.baidu.com") 第一个am代表目录,这样去打开浏览器

MakeFile

在Linux环境编译,在Android中用来生成.so工具

文件目录:

使用gcc编译so最原始的方法:

        1:首先要把.c文件编译成.o文件

                gcc -c main.c  

                gcc -c plus.c

                会得到一个main.o和plus.o的文件

        2:把.o文件编译成.so文件

                gcc main.o -o main 得到main.so

这样很麻烦,使用makefile来编译(其实还是使用的gcc)

首先创建一个Makefile文件(必须这个名字)

方式一:

JNI——AM和 MakeFile_第1张图片

空格是TAB键

方式二:

JNI——AM和 MakeFile_第2张图片

OBJECTS定义一个变量, $^代表依赖文件 就是A.c b.cpp等 $@代表目标文件即生成的.o文件

方式三:

JNI——AM和 MakeFile_第3张图片

OBJECTS是.o文件的集合,怎么得到.o文件呢?就是把.c文件的后缀改成.o

在SOURCES中把.c文件替换成.o

定义自己的变量:

使用make test 输出结果:10 20  因为是$2 $1 如果是$1 $2 结果就是20 10

递归展开式:

变量写在下面照样能输出结果,如果在写一个str1=helloworld,结果也会被改变。

直接展开:

JNI——AM和 MakeFile_第4张图片

如果把str3申明在str4下面,就显示空白

使用ifeq作为条件判断语句

CMakeLists:

使用CMakeLists编译so库,首先创建目录结构

JNI——AM和 MakeFile_第5张图片

在src中放入.c和.cpp源文件,include中放入.h头文件

CMakeLists.txt必须这个名字

JNI——AM和 MakeFile_第6张图片

首先必须要有最小版本号,字母可以小写。然后就可以编译so了

先要安装CMake:在build目录下执行 需要root权限,我的是centerOS环境

yum install CMake

如果没有安装g++就执行CMake..会报一个your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found的异常

安装g++:

yum install gcc-c++

这之后再执行CMake..会在build目录下生成一堆文件

JNI——AM和 MakeFile_第7张图片

自动帮我们生成好了Makefile,然后像Makefile那样执行make命令就编译成功拉。

语法:

1:变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值

2:command (args ...) #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格

3: set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样一个string list

4: Add_executable(${var}) <=> Add_executable(a b c) #变量使用${xxx}引用

5:条件语句:if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT

    if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT

         …

    else()/elseif() … endif(var)

6: 循环语句
        Set(VAR a b c)

        Foreach(f ${VAR})      …Endforeach(f)

        WHILE() … ENDWHILE()

内部变量:

CMAKE_C_COMPILER:指定C编译器

CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项

EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

LIBRARY_OUTPUT_PATH:库文件路径

CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

命令:

project (HELLO) #指定项目名称,生成的VC项目的名称;

            >>使用${HELLO_SOURCE_DIR}表示项目根目录

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

            >> include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为

                 include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

             >> link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link

                    目录

add_subdirectory:包含子目录

               >> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

                >> add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译

                       成可执行文件——

add_definitions:添加编译参数

                >> add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

                >> add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

                  >> target_link_libraries(demo Hello) #将可执行文件与Hello连

                    接成最终文件demo

add_library:

            >> add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a

#在指定目录下搜索一个库, 保存在变量MY_LIB中

find_ibrary(MY_LIB libmylib.a ./)

link_libraries( lib1 lib2 ...): All targets link with the same set of libs

你可能感兴趣的:(JNI——AM和 MakeFile)