在实际开发中,有时候时间短,任务量大,可以查看类似的apk,将行apk反编译,通过看源码分析,用里面的JNI代码!
本案例中用了美图秀秀的JNI.java和jni.so链接库
项目中调用别人写的c代码:
1.得到so和开发文档;
2.把so文件放到libs/armeabi/目录下;
3.根据开发文档在java代码中写一个本地方法;
4.加载动态库,调用本地方法.
准备工作 :
创建一个第三方美图秀秀apk中JNI的一样的包名,将JNI,java放入此包名下
将得到的so所在的文件夹armeapi复制在libs下
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 {static {System.loadLibrary("mtimage-jni");//注意:这么名字是libs/armeapi下so的名字,去除前面的lib和后面的.so得到的}private ImageView iv;private Bitmap bmp;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.iv);bmp = BitmapFactory.decodeFile("/mnt/sdcard/aa.jpg");iv.setImageBitmap(bmp);}public void show(View v){int width = bmp.getWidth();int height = bmp.getHeight();int[] pixels = new int[width*height];bmp.getPixels(pixels , 0, width, 0, 0, width, height);JNI jni = new JNI();jni.StyleLomoHDR(pixels, width, height);Bitmap bitmap = Bitmap.createBitmap(pixels, width, height, bmp.getConfig());iv.setImageBitmap(bitmap);}
}