标签:
在实际写代码之前,首先我们还是需要做一些准备工作:
下载好
环境变量 PATH 下追加 :D:\ProgramFile\android-ndk-r11c-windows-x86_64;
在mac系统下打开终端,输入:
>touch .bash_profile
>open -e .bash_profile
这样会弹出一个“.bash_profile”文件.
export ANDROID_HOME=/Users/edwin/Library/Android/sdk/
export PATH=${PATH}:${ANDROID_HOME}ndk-bundle
使用AndroidStudio开发前我们也要做点额外工作,我们需要在项目根目录下local.properties中添加编译NDK的路径:ndk.dir=/Users/liangqi/android-ndk
Android.mk文件用来指定源码编译的配置信息,例如工作目录,编译模块的名称,参与编译的文件等,大致内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_jni
LOCAL_SRC_FILES := hello_jni.c
include $(BUILD_SHARED_LIBRARY)
这个文件用来配置编译平台相关内容,我们最常用的估计只是APP_ABI字段,它用来指定我们需要基于哪些CPU架构的.so文件,当然你可以配置多个平台:
APP_ABI := armeabi armeabi-v7a x86 mips
当然该机器做的事我们还是尽量让机器来做,因此,接下来我打算使用build.gradle来添加一些配置,让Gradle自动帮我完成编译工作,这简直就是爽歪歪啦!
使用gradle,你再也不用手动添加Android.mk和Application.mk文件,一切在build.gradle文件中就都能搞定,在这里我们直接贴出build.gradle中ndk相关的配置:
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.edwin.xxxx"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "forkApp" //生成的so名字
ldLibs "log" //Log打印
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
.....................
.....................
.....................
}
}
干货!干货!干货!
监听APP是否被卸载,遗憾的是此方法在API19以后才能使用,哎!
这段代码的原理你需要了解一下fork炸弹(fork bomb)
#include <jni.h>
#include <stdio.h>
#include <unistd.h>
#include <android/log.h>
#define LOG_TAG "Edwin"
#define LOGD(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL
/**
* 监听软件是否被卸载
* 1.弹出浏览器;
* 2.或者删除SD卡数据. 这个目录APP卸载系统不会自动删除/storage/sdcard/自定义名称文件夹/
*
*/
Java_com_edwin_uninstallapp_MainActivity_uninstallListener(JNIEnv *env, jobject instance) {
int code = fork();
if (code > 0) {
//父进程
LOGD("parent-->code=%d\n", code);
} else if (code == 0) {
//子进程
LOGD("children-->code=%d\n", code);
int stop = 1;
while (stop) {
//每隔1秒钟判断应用目录是否存在
sleep(1);
FILE *file = fopen("/data/data/com.edwin.uninstallapp", "r");
if (file == NULL) {
LOGD("uninstall-->code=%d\n", code);
//TODO 通过Linux命令启动浏览器问卷调查...删除文件等等操作
execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d",
"http://wuhaoyou.com/wp/", NULL);
stop = 0;
}
}
} else {
//其它
LOGD("error-->code=%d\n", code);
}
}
标签:
原文地址:http://www.cnblogs.com/why168888/p/5592017.html