1.模拟美图秀秀的修改图形
1.反编译mtxx.apk,得到so文件,放到自己工程下的libs目录下;2.反编译mtxx.apk,查看JNI的java代码.3.按照mtxx.apk中的包名在自己工程中创建包名,创建JNI类,把2中JNI中的代码拷贝过来;4.在调用JNI中的修改图形的方法,修改图形的数组. public void click(View v){ //1.得到原图 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.after2); int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; // 2.得到原图的颜色对应的数组 // 参1:图形颜色对应的数组 // 参2:开始写颜色数据的索引位置 bitmap.getPixels(pixels , 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); // 3.调用so的方法修改数组中的数据 JNI jni = new JNI(); // 参1:pixels 需要修改的数组 jni.StyleLomoC(pixels, bitmap.getWidth(), bitmap.getHeight()); // 4.使用修改后的数组创建一个新的图片 Bitmap newBitmap = Bitmap.createBitmap(pixels, bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); // 5.显示图片 iv.setImageBitmap(newBitmap);}
2.锅炉压力表
1.在Android界面上显示柱状的图形:柱的高低与压力值有关柱的颜色与压力的区间有关系MainActivity.java: public class MainActivity extends Activity { private PresureView view; private int presure; private Timer timer; private TimerTask task; static { // 加载动态库 System.loadLibrary("PresureDemo"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); timer = new Timer(); task = new TimerTask() { @Override public void run() { // 调用C代码得到压力值 presure = getPresure(); runOnUiThread(new Runnable() { @Override public void run() { if (presure <= 200) { view = new PresureView(MainActivity.this, presure); setContentView(view); } else { TextView view = new TextView( getApplicationContext()); view.setText("哥哥,赶快跑,锅炉要爆炸了!!!!!!!!"); view.setTextColor(Color.RED); view.setTextSize(25); setContentView(view); // 爆炸后停止更新柱状图标 timer.cancel(); task.cancel(); timer = null; task = null; } } }); } }; timer.scheduleAtFixedRate(task, 500, 1000); } public native int getPresure(); }
PresureView.java:
public class PresureView extends View { private Paint paint; private int mPresure; public PresureView(Context context,int presure) { super(context); // 接收传过来的压力值 mPresure = presure; paint = new Paint(); } /** * 界面一打开就调用这个方法绘制图形 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(0< mPresure && mPresure <= 180){ paint.setColor(Color.GREEN); }else if(mPresure <= 250){ paint.setColor(Color.YELLOW); }else if(mPresure < 280){ paint.setColor(Color.RED); }else { // 锅炉要爆炸了 } canvas.drawRect(20, 300 - mPresure, 40, 300, paint); } }2.在c代码中得到压力:#include #include #include "cn_itcast_presuredemo_MainActivity.h"#include #define LOG_TAG "System.out"#define LOGE(...)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#define LOGI(...)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)int getPresure(){ // 得到一个随机的数字 int presure = rand(); return presure % 300;}JNIEXPORT jint JNICALL Java_cn_itcast_presuredemo_MainActivity_getPresure (JNIEnv * env, jobject obj){ int presure = getPresure(); return presure;}
3.卸载应用打开浏览器
#include #include #include "cn_itcast_uninstallappdemo_MainActivity.h"JNIEXPORT void JNICALL Java_cn_itcast_uninstallappdemo_MainActivity_callUninstallApp( JNIEnv * env, jobject obj) { int isStop = 1; // 使用fork函数分裂一个进程 int result = fork(); if (result > 0) { // 说明当前程序是运行在父进程中的 } else if (result == 0) { // 说明当前程序是运行在子进程中的 while (isStop) { // 睡眠1秒 sleep(1); // FILE *fopen(const char *, const char *); FILE* file = fopen("/data/data/cn.itcast.uninstallappdemo