标签:注意 参数 uil jnienv adb shell 环境变量 img pid har
#获取当前的目录全路径 LOCAL_PATH := $(call my-dir) # 清除之前编译时的配置信息 不会把call my-dir 这一步的内容清除 include $(CLEAR_VARS) #编译之后生成的模块的名字 系统会自动加上一个lib前缀 LOCAL_MODULE := hello-jni #告诉编译系统我要编译的源码的文件名字 LOCAL_SRC_FILES := hello.c #生成一个动态链接库 .so文件 include $(BUILD_SHARED_LIBRARY)
public class MainActivity extends Activity { private ImageView iv_image; private Bitmap bitmap; private JNI jni; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_image = (ImageView) findViewById(R.id.iv_image); bitmap = BitmapFactory.decodeFile("storage/sdcard/front.jpg"); iv_image.setImageBitmap(bitmap); jni = new JNI(); } public void processPic(View v){ //图片的宽高 实际上就是 图片横向有多少个像素 竖直方向有多少个像素 int width = bitmap.getWidth(); int height = bitmap.getHeight(); //ARGB 8888 //alpha 透明度 8个bit 8位二进制数 //red 红色 8位二进制数 //G green 绿色 8位二进制数 //B blue 蓝色 8位二进制数 //一个像素 可以用4byte的 内存来保存 int 4byte //创建一个数组 用来保存图片的颜色信息 int pixels[] = new int[width*height]; //第一个参数 准备好的数组 用来保存图片的每一个像素的颜色信息 //第二个参数 写入到pixels数组中第一元素的偏移量 也就是开始的索引 //第三个参数 传入一个>=bitmap宽度的值 如果>bitmap的宽度 会有类似墙纸平铺的效果 现在想获取整张图片所以传入bitmap的宽度 //第四个,第五个参数 从bitmap中读出的第一个像素的坐标 //第六个第七个参数 从bitmap中每一行 读出多少个像素 每一列读出多少个像素 bitmap.getPixels(pixels, 0, width, 0, 0, width, height); //getPixels方法执行完 pixels数组中就保存了跟图片相关的所有像素信息 //jni.StyleLomoB(pixels, width, height); jni.StyleJapanese(pixels, width, height); //StyleLomoB 这个方法执行完之后 pixels又发生了变化 所有的像素已经是加了特效的像素信息了 //我拿着处理好的像素的数组创建一张新的图片 这个图片就包含特效了 Bitmap bitmap2 = Bitmap.createBitmap(pixels, width, height, bitmap.getConfig()); //bitmap2已经有特效了通过imageview展示出来 iv_image.setImageBitmap(bitmap2); //c的函数 可以处理图片 需要你传递 图片int数组的首地址 传递图片的宽度 高度 //int* p = GetIntArrayElments(env,jarry,NULL); //becomeBeautiful(int* ,intwith, int height) //becomeB(p,width,height); }}#include <jni.h> //直接到系统指定的include目录去找#include "com_itheima_cppjni_MainActivity.h" //用双引号 来include头文件 会先到当前目录下找.h 当前目录没有 去系统指定的include目录找JNIEXPORT jstring JNICALL Java_com_itheima_cppjni_MainActivity_sayHelloInCPP (JNIEnv * env, jobject obj){ //在c++当中 JNIEnv不再是结构体的一级指针 而是结构体的别名 实际上就是结构体 //所以 env 是结构体一级指针 通过env访问函数的时候 直接env-> // C++的结构体 可以有函数实现 c的结构体只能有函数指针 //在c++中 JNIEnv 实际上是结构体 _JNIEnv的别名 _JNIEnv 包含了一堆函数 //实际上就是调用了 结构体JNINativeInterface的同名函数指针 //所以在写c++的jni相关代码时 调用到_JNIEnv结构体里的函数跟c的时候 名字都一样 //有区别的是 第一个参数 env不用传了 _JNIEnv结构体 在调用同名函数指针的时候把第一个参数 已经传进去了 //c++的函数要先声明再使用 可以使用javah生成的头文件作为函数声明 return env->NewStringUTF("hello from cpp!!!");}JNIEXPORT void JNICALL Java_com_itheima_cfork_MainActivity_cfork (JNIEnv * env, jobject obj){ int pid = fork(); //如果成功复制了(分叉了)一个进程 返回值会>=0 //如果返回值<0说明分叉失败 if(pid>0){ LOGE("pid=%d",pid); }else if(pid == 0){ //复制出的进程 来作为守护进程 我可以不断检测父进程的编号 如果变成1了说明亲爹不在了(应用进程别杀死了) //① 进程死了 应用还在 //② 进程死了 应用也卸了 LOGE("pid==0"); int ppid; FILE* file = NULL; //执行在子进程中 这个进程是由java进程复制出来的(分叉出来); while(1){ LOGE("subprocess is running"); sleep(3); //获取当前进程的父进程编号 ppid = getppid(); //如果父进程编号变为init进程了 if(ppid==1){ //应用进程别杀死了 file = fopen("/data/data/com.itheima.cfork","r"); if(file==NULL){ //应用被卸载了 弹出浏览器 显示调查问卷 execlp("am", "am", "start", "--user","0","-a", "android.intent.action.VIEW", "-d", "http://www.baidu.com", (char *) NULL); }else{ //应用还在 重新开启进程 execlp("am", "am", "start", "--user","0", "-n" , "com.itheima.cfork/com.itheima.cfork.MainActivity",(char *) NULL); } } } }else{ LOGE("failed"); }}标签:注意 参数 uil jnienv adb shell 环境变量 img pid har
原文地址:http://www.cnblogs.com/Oldz/p/6886479.html