c++ 开发JNI
- C的预处理命令
- #开头的就是c/c++的预处理命令
- 在编译之前 先会走预编译阶段 预编译阶段的作用就是 把 include进来的头文件 copy到源文件中
- define这些宏定义 用真实的值替换一下
- #if #else #endif 该删除的删除掉
-
- c++开发jni代码时 env不再是结构体Jninativeinterface的二级指针
- _JNIEnv JNIEnv _JNIEnv 是C++的结构体 C++结构体跟C区别 C++的结构体可以定义函数
- env 是JNIEnv的一级指针 也就是结构体_JNIEnv的一级指针 env-> 来调用 结构体里的函数
- _JNIEnv的函数 实际上调用的就是结构体JNINativeInterface的同名函数指针
在调用时第一个参数 env已经传进去了
C++的函数要先声明再使用 可以把javah生成的头文件include进来作为函数的声明
- include的方法 <> “” “”
- 如果用”” 来导入头文件 系统会先到 源代码所在的文件夹去找头文件 如果找不到再到系统指定的incude文件夹下找
- //用<> 直接到系统指定的include目录下去找
am 命令
- am命令 :在adb shell里可以通过am命令进行一些操作 如启动activity Service 启动浏览器等等
- am命令的源码在Am.java中, 在adb shell里执行am命令实际上就是启动一个线程执Am.java的main方法,am命令后面带的参数都会当作运行时的参数传递到main函数中
- am命令可以用start子命令,并且带指定的参数
- 常见参数: -a: action -d data -t 表示传入的类型 -n 指定的组件名字
- 举例: 在adb shell中通过am命令打开网页
- am start –user 0 -a android.intent.action.VIEW -d http://www.baidu.com
- 通过am命令打开activity
- am start –user 0 -n com.itheima.fork/com.itheima.fork.MainActivity
(系统sdk版本>16 需要加上–user 0 , <16不需要加)
execlp c语言中执行系统命令的函数
- execlp() 会从PATH环境变量所指的目录中查找符合参数file的文件找到后就执行该文件, 第二个参数开始就是执行这个文件的 args[0],args[1] 最后一个参数用(char*)NULL结束
- android开发中 execlp函数对应android的path路径为system/bin/目录
调用格式
execlp("am", "am", "start", "--user","0","-a", "android.intent.action.VIEW", "-d", "http://www.baidu.com", (char *) NULL); execlp("am", "am", "start", "--user","0", "-n" , "com.itheima.cforktest/com.itheima.cforktest.MainActivity",(char *) NULL);