編輯:關於android開發
本文屬於實戰系列,是對《Android C代碼回調java方法》等文的實踐,調用meitu秀秀的libmtimage-jni.so文件來實現圖片的美化功能
首先反編譯得到/libmtimage-jni.so文件和JNI文件
新建項目,將/libmtimage-jni.so文件拷貝到libs文件夾下,新建JNI文件並拷貝代碼,並導入loadLibrary
package com.mt.mtxx.image; public class JNI { static{ System.loadLibrary("mtimage-jni"); } public native void AutoColor(byte[] paramArrayOfByte, int paramInt1, int paramInt2, int paramInt3, int paramInt4); public native void AutoColorLevel(byte[] paramArrayOfByte, int paramInt1, int paramInt2, boolean paramBoolean); public native void AutoConstrast(byte[] paramArrayOfByte, int paramInt1, int paramInt2); public native void AutoWhiteBalance(byte[] paramArrayOfByte, int paramInt1, int paramInt2); public native void BackWeak(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, int paramInt1, int paramInt2, int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt3, byte[] paramArrayOfByte3, int paramInt4, int paramInt5); public native void BackWeak2(byte[] paramArrayOfByte1, int paramInt1, int paramInt2, int paramInt3, int paramInt4, byte[] paramArrayOfByte2, int paramInt5, int paramInt6); public native void BackWeakLine(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, int[] paramArrayOfInt3, int[] paramArrayOfInt4, float paramFloat, int paramInt3, int paramInt4); public native void BackWeakOne(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, int paramInt3, int paramInt4, byte[] paramArrayOfByte, int paramInt5, int paramInt6); public native void CColorBalance(boolean paramBoolean, int paramInt1, int paramInt2, int paramInt3, int paramInt4, byte[] paramArrayOfByte, int paramInt5, int paramInt6); public native void ColorModeEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2); public native void CompositeColorEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void DrawEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2); public native void ExclusionEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ExclusionEx2(byte[] paramArrayOfByte, byte paramByte1, byte paramByte2, byte paramByte3, double paramDouble); public native void FaceBeauty(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3); public native void FaceBeautyRelease(); public native void FrameXCBK(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, int paramInt3); public native void GaussIIRBlurBrush(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3, int paramInt4); public native void GaussIIRBlurImage(byte[] paramArrayOfByte, int paramInt1, int paramInt2, int paramInt3, int paramInt4); public native double GetDegreeByPoints(int paramInt1, int paramInt2, int paramInt3, int paramInt4); public native void Grayscale(byte[] paramArrayOfByte, int paramInt1, int paramInt2); public native void HardlightEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageColorBurnEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2); public native void ImageDarkenEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageExclusionEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageLightenEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageNormalEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageOverlayEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageScreenEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void ImageSoftLightEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void LOMO1(int[] paramArrayOfInt1, int paramInt1, int paramInt2, int[] paramArrayOfInt2); public native void LOMO2(int[] paramArrayOfInt1, int paramInt1, int paramInt2, int[] paramArrayOfInt2); public native void LightEnEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void MakeAllTransparent(byte[] paramArrayOfByte, int paramInt1, int paramInt2); public native void MultipleEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void NoiseEx(byte[] paramArrayOfByte, long paramLong); public native void NormalEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void OldImage(byte[] paramArrayOfByte1, int paramInt1, int paramInt2, byte[] paramArrayOfByte2, int paramInt3, int paramInt4); public native void PinLightEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2); public native void PtChangeByRotate(byte[] paramArrayOfByte, double paramDouble1, double paramDouble2, double paramDouble3); public native void RGBtoXYZ(byte paramByte1, byte paramByte2, byte paramByte3, byte[] paramArrayOfByte); public native void RGBtoYIQ(byte paramByte1, byte paramByte2, byte paramByte3, byte[] paramArrayOfByte); public native void RGBtoYUV(byte paramByte1, byte paramByte2, byte paramByte3, byte[] paramArrayOfByte); public native void Resample(byte[] paramArrayOfByte1, int paramInt1, int paramInt2, int paramInt3, byte[] paramArrayOfByte2, int paramInt4, int paramInt5); public native void SSkinbeautify(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3, int paramInt4, int paramInt5, double paramDouble); public native void ScreenEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void SetBackWeakRadius(byte[] paramArrayOfByte, int paramInt1, int paramInt2); public native void SetColorImage(byte[] paramArrayOfByte, int paramInt1, int paramInt2, int paramInt3, int paramInt4, int paramInt5); public native void SetGrayScaleEx(byte[] paramArrayOfByte); public native void Sharp(int[] paramArrayOfInt, int paramInt1, int paramInt2, float paramFloat1, float paramFloat2); public native void SharpPreview(int[] paramArrayOfInt, int paramInt1, int paramInt2, float paramFloat1, float paramFloat2); public native void SharpPreviewRelease(); public native void ShiftRGBEx(byte[] paramArrayOfByte, byte paramByte1, byte paramByte2, byte paramByte3); public native void SkinWhite(int[] paramArrayOfInt, int paramInt1, int paramInt2, int paramInt3); public native void SoftLightEx(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, double paramDouble); public native void StyleBaoColor(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleCinnamon(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleClassic(int[] paramArrayOfInt, int paramInt1, int paramInt2, double paramDouble); public native void StyleClassicStudio(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleEP1(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleEP2(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleElegant(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleElegantNew(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleFP1(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleFP2(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleFilm(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleGP1(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, byte[] paramArrayOfByte, int paramInt3); public native void StyleGP2(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, byte[] paramArrayOfByte, int paramInt3); public native void StyleImpression(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleJapanese(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleLomoAP1(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, byte[] paramArrayOfByte, int paramInt3); public native void StyleLomoAP2(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, byte[] paramArrayOfByte, int paramInt3); public native void StyleLomoB(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleLomoBrightRed(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleLomoC(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleLomoChristmas(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleLomoHDR(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void StyleMilk1(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleMilk2(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleMilk3(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleMilk4(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleOldPhoto(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2); public native void StyleOldPhotoP1(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, byte[] paramArrayOfByte, int paramInt3); public native void StyleOldPhotoP2(int[] paramArrayOfInt1, int[] paramArrayOfInt2, int paramInt1, int paramInt2, byte[] paramArrayOfByte, int paramInt3); public native void StyleRetro(int[] paramArrayOfInt, int paramInt1, int paramInt2); public native void XYZtoRGB(byte paramByte1, byte paramByte2, byte paramByte3, byte[] paramArrayOfByte); public native void YIQtoRGB(byte paramByte1, byte paramByte2, byte paramByte3, byte[] paramArrayOfByte); public native void YUVtoRGB(byte paramByte1, byte paramByte2, byte paramByte3, byte[] paramArrayOfByte); public native int add(int paramInt, byte paramByte); public native byte[] deal(byte[] paramArrayOfByte, int paramInt1, int paramInt2, int paramInt3, int paramInt4, String paramString); }
項目布局如下:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="process" android:text="美化" /> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/button" /> </RelativeLayout>
(圖片來自於網絡)
代碼如下:
package com.wuyudong.wuxiuxiu; import com.mt.mtxx.image.JNI; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView image; private JNI jni; private Bitmap bm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image); bm = BitmapFactory.decodeFile("sdcard/awaiyi.jpg"); image.setImageBitmap(bm); jni = new JNI(); } public void process(View v) { int width = bm.getWidth(); int height = bm.getHeight(); int[] pixels = new int[width * height]; // getPixels執行之後pixels數組就被修改了 pixel中保存了bm的顏色信息 bm.getPixels(pixels, 0, width, 0, 0, width, height); // StyleLomoB運行後,pixel的顏色信息已經被修改 修改成特效處理後的顏色信息 jni.StyleLomoB(pixels, width, height); // 用處理好的像素數組 創建一張新的圖片就是經過特效處理的 Bitmap bm2 = Bitmap.createBitmap(pixels, width, height, bm.getConfig()); image.setImageBitmap(bm2); } }
獲取更多C語言與算法相關知識,關注公眾號:“csuanfa”
Android開發自學筆記(Android Studio)—4.3ImageView及其子類,androidstudio自學一、引言 ImageView繼承自View組件
本節接著講用戶界面中的幾個控件,包括Spinner、AutoCompleteT
安卓開源項目周報0104,安卓開源項目0104由OpenDigg 出品的安卓開源項目周報第四期來啦。我們的安卓開源周報集合了OpenDigg一周來新收錄的優質的
【Android性能工具】騰訊開源工具GT(隨身調),androidgt做App測試時監測使用期間的cpu,內存,流量,電量等指標時,發現的企鵝很好用的工具。 備份至此,