Android JNI 使用别人的.so类库(盗版美图秀秀)
来源:互联网 发布:明星淘宝店叫什么名字 编辑:程序博客网 时间:2024/05/20 10:52
项目简介:
该项目为盗版的美图秀秀
详细介绍:
在开发中,可能使用别人写的C方法,这里就用美图秀秀为例子,演示如何使用别人已经编译好的.so类库。
整个应用如下:
用户点击按钮后,会将一张图片加入美图效果(如色彩变暗,复古或者其他效果):
可以看到,图片的效果的确变了,整个图片变得黄了一些
该应用涉及到的知识有:
- 1.使用已有软件的.so类库
首先要先把别人的APK反编译,得到本地方法(一般在JNI.java文件中),然后解压缩APk文件,得到.so类库,最后就是如何在java中调用C框架的事了
注意:
- 1.本题中美图秀秀的APK文件反编译后,只得到了支持arm架构的CPU的.so类库,所以只能在arm架构CPU的手机上运行该项目
步骤:
1.创建一个Android项目
准备工作。由于用到美图秀秀的.so类库,所以把美图秀秀解压,然后找到打开\lib\armeabi,发现该文件夹下有个libmtimage-jni.so文件,直接把该文件连同armeabi文件夹复制,然后粘贴到项目的libs文件夹下。
将美图秀秀的安装包mtxx.apk反编译(详情请看这篇文章APK文件反编译工具),反编译后打开得到的jar包,如下所示:
看到有个JNI文件,打开后把代码全部复制,然后在自己的项目下创建一个同名文件,粘贴代码。要求自己项目下的同名文件包名都要一样,如下所示:
2.布局文件
编写activity_mian.xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="hhh.exercise.ujni_d.MainActivity" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click" android:text="美化一下" android:textColor="#0000ff" android:textSize="30sp" /> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
布局文件很简单,就一个Button和一个ImageView。ImageView用来显示一张图片,当点击Button后该图片效果会发生改变。
3.Activity
编写MainActivity.java 文件:
import com.mt.mtxx.image.JNI;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class MainActivity extends Activity { private ImageView iv; private Bitmap bitmap; static { // 加载类库。但是项目中使用的是别人的类库,没有jni文件,更没有Android.mk文件,无法知道类库名称 // 根据掐头去尾的原则,导入的类库/libs/armeabi/libmtimage-jni.so,把libmtimage-jni.so的lib和.so去掉就行 System.loadLibrary("mtimage-jni"); }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.t2); iv.setImageBitmap(bitmap); } public void click(View view) { JNI jni = new JNI(); // 类库是从美图秀秀中盗取的,所以没有注释,只能靠自己猜测类JNI中的方法作用 // 这里我们以其中一个方法为例子 int width = bitmap.getWidth(); int height = bitmap.getHeight(); // 创建数组,用于保存图片中又有的像素信息 int[] pixels = new int[width * height]; // 获取所有的像素信息,保存到pixels数组中 bitmap.getPixels(pixels, 0, width, 0, 0, width, height); // 第一个参数是像素信息 // 第二个参数是图片的宽 // 第三个参数是图片的高 // 该方法会改变pixels的信息 jni.StyleLomoB(pixels, width, height); // 用改变后的pixels构建一个Bitmap对象 Bitmap bitmap2 = Bitmap.createBitmap(pixels, width, height, bitmap.getConfig()); // 把新图显示在界面上 iv.setImageBitmap(bitmap2); }}
整个Demo完成了。但是有一点,就是不知道JNI类中的函数是干什么的,这个只能自己一个一个去用,然后看看效果是什么样的,就可以了。
1 1
- Android JNI 使用别人的.so类库(盗版美图秀秀)
- 调用别人写好的jni.so库文件
- android NDK JNI so文件的制作和使用
- android NDK JNI so文件的制作和使用
- JNI的入门使用及so库的生成(Android Studio环境)
- Android studio 初步使用JNI(二)制作.so库
- JNI 如何使用dlopen,dlsym调用第三方自定义的 .so库(包括JNI->JNI)
- Android Studio使用jni、so库
- Android Studio使用jni、so库
- JNI使用实例:Android Studio使用JNI编译so库
- Android Studio 调用写好的SO文件(JNI)
- Android 静态和动态的调用so库(JNI)
- android JNI的.so库调用
- android的jni访问linux原生so
- android的jni访问linux原生so
- JNI 如何使用dlopen,dlsym调用第三方自定义的 .so库( JNI->C,C++)
- android jni 入门(2)jni编译生成so包
- 3. Android工程中使用FFmpeg的so库 -- JNI头文件的生成
- 我们为什么需要SDN?
- 【亲测】Android ----waiting for debugger
- 深度优先搜索算法
- 39
- OpenGLES的简单应用绘图,以及照相机画面变色变形渲染(八)
- Android JNI 使用别人的.so类库(盗版美图秀秀)
- C# 反射
- 分区表 UDF
- [unity3D基础篇03]必备的3D数学基础2
- Java String intern方法介绍
- protobuf 嵌套消息的使用
- 深度学习——引用量最高的20篇论文(2014-2017)
- Linux Tomcat日志查看实用命令
- 设置datepicker日期可选范围为当前年份第一天或者当前月份第一天至当前日期