AndroIDstudio 编译jpeglib 和 pnglig的 so的简单记录
编译多个SO: 用ADD_subdirectory 添加多个目录, 生产多个SO
mylibrary/CMakeLists.txt png 和 jpeg 目录下有源码和CMakeLists.txt 生产SO,
cmake_minimum_required(VERSION 3.4.1)#设置生成的so动态库最后输出的路径set(CMAKE_liBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})#添加子目录,将自动找到子目录中的CMakeLists.txtADD_subdirectory(${PROJECT_SOURCE_DIR}/src/main/cpp/png)ADD_subdirectory(${PROJECT_SOURCE_DIR}/src/main/cpp/jpeg)
测试libjpeg 和libpng:
可以从编译出来的aar中解压得到so
NativeFunc.java
public class NativeFunc { static { System.loadlibrary("native-lib"); } //测试libjpeg, 保存bitmap到/sdcard/image_test_save.jpeg public static native voID saveJpeg(Bitmap bitmap); //测试libpng, 保存bitmap到/sdcard/image_test_save.png public static native voID savePng(Bitmap bitmap);}
//native-lib.cpp
#include <jni.h>#include <string>#include <androID/bitmap.h>#include <androID/log.h>extern "C" {#include "jpeg/jpeglib.h"}#include "png/png.h"#define LOG_TAG "native_lib"#define LOGI(...) __androID_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define LOGE(...) __androID_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)static voID init_buffer(struct jpeg_compress_struct * c) {}static boolean empty_buffer(struct jpeg_compress_struct * compress_struct) { return TRUE;}static voID term_buffer(struct jpeg_compress_struct * c) {}GLOBAL(voID)write_JPEG_Buff(uint8_t *buffPtr, int image_wIDth, int image_height, JsAMPLE *imageBuffer, int resolution, int *numCompBytes) { struct jpeg_error_mgr jerr; struct jpeg_compress_struct cinfo = { .clIEnt_data = NulL, .err = jpeg_std_error(&jerr) }; jpeg_create_compress(&cinfo); struct jpeg_destination_mgr dm = { .init_destination = init_buffer, .empty_output_buffer = empty_buffer, .term_destination = term_buffer, .next_output_byte = buffPtr, .free_in_buffer = (size_t) image_wIDth * image_height * 3 }; cinfo.dest = &dm; cinfo.image_wIDth = (jdiMENSION) image_wIDth; cinfo.image_height = (jdiMENSION) image_height; cinfo.in_color_space = JCS_EXT_RGBA; cinfo.jpeg_color_space = JCS_EXT_RGBA; cinfo.input_components = 4; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, 95, TRUE); // TRUE = limit to baseline-JPEG values cinfo.MCUs_per_row = (jdiMENSION) image_wIDth; cinfo.MCU_rows_in_scan = (jdiMENSION) image_height; jpeg_start_compress(&cinfo, TRUE); int row_strIDe; // physical row wIDth in image buffer row_strIDe = image_wIDth * cinfo.input_components; // JsAMPLEs per row in imageBuffer JsAMPROW row_pointer[1]; // pointer to JsAMPLE row[s] while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &imageBuffer[cinfo.next_scanline * row_strIDe]; (voID) jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); *numCompBytes = (int) (cinfo.dest->next_output_byte - buffPtr);}//测试libjpeg, 保存bitmap到/sdcard/image_test_save.jpegextern "C" JNIEXPORT voID JNICALLJava_com_lightin_imagedemo_NativeFunc_saveJpeg( jnienv *env, jclass type, /* this */ jobject bitmap) { AndroIDBitmAPInfo info; int ret; int wIDth = 0; int height = 0; voID* pixels; if ((ret = AndroIDBitmap_getInfo(env, bitmap, &info)) < 0) { LOGE("AndroIDBitmap_getInfo() Failed ! error=%d", ret); return; } wIDth = info.wIDth; height = info.height; if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { LOGE("Bitmap format is not RGBA_8888 !"); return; } if ((ret = AndroIDBitmap_lockPixels(env, bitmap, &pixels)) < 0) { LOGE("AndroIDBitmap_lockPixels() Failed ! error=%d", ret); } char filename[100]; sprintf(filename,"/sdcard/image_test_save.jpeg"); file *file; file = fopen(filename, "wb"); int *ybuf = (int *)malloc(sizeof(int) * (wIDth*height)); int outSize; write_JPEG_Buff((uint8_t*)ybuf,wIDth,height,(JsAMPLE *)pixels,0, &outSize); fwrite((unsigned char *)ybuf, outSize, 1, file); fclose(file); if(ybuf) free(ybuf); AndroIDBitmap_unlockPixels(env, bitmap);}int writePng(char* png_file_name, unsigned char* pixels , int wIDth, int height, int bit_depth){ png_structp png_ptr; png_infop info_ptr; file *png_file = fopen(png_file_name, "wb"); if (!png_file) { return -1; } png_ptr = png_create_write_struct(PNG_liBPNG_VER_STRING, NulL, NulL, NulL); if(png_ptr == NulL) { printf("ERROR:png_create_write_struct/n"); fclose(png_file); return 0; } info_ptr = png_create_info_struct(png_ptr); if(info_ptr == NulL) { printf("ERROR:png_create_info_struct/n"); png_destroy_write_struct(&png_ptr, NulL); return 0; } png_init_io(png_ptr, png_file); png_set_IHDR(png_ptr, info_ptr, wIDth, height, bit_depth, PNG_color_TYPE_RGB_Alpha, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_colorp palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color)); if (!palette) { fclose(png_file); png_destroy_write_struct(&png_ptr, &info_ptr); return false; } png_set_pltE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH); png_write_info(png_ptr, info_ptr); png_set_packing(png_ptr); //这里就是图像数据了 png_bytepp rows = (png_bytepp)png_malloc(png_ptr, height * sizeof(png_bytep)); for (int i = 0; i < height; ++i) { rows[i] = (png_bytep)(pixels + (i) * wIDth*4 ); } png_write_image(png_ptr, rows); delete[] rows; png_write_end(png_ptr, info_ptr); png_free(png_ptr, palette); palette=NulL; png_destroy_write_struct(&png_ptr, &info_ptr); fclose(png_file); return 0;}//测试libpng, 保存bitmap到/sdcard/image_test_save.pngextern "C" JNIEXPORT voID JNICALLJava_com_lightin_imagedemo_NativeFunc_savePng( jnienv *env, jclass type/* this */, jobject bitmap) { AndroIDBitmAPInfo info; int ret; int wIDth = 0; int height = 0; voID* pixels; if ((ret = AndroIDBitmap_getInfo(env, bitmap, &info)) < 0) { LOGE("AndroIDBitmap_getInfo() Failed ! error=%d", ret); return; } wIDth = info.wIDth; height = info.height; if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { LOGE("Bitmap format is not RGBA_8888 !"); return; } if ((ret = AndroIDBitmap_lockPixels(env, bitmap, &pixels)) < 0) { LOGE("AndroIDBitmap_lockPixels() Failed ! error=%d", ret); } char filename[100]; sprintf(filename,"/sdcard/image_test_save.png"); writePng(filename,( unsigned char*)pixels,wIDth,height,8); AndroIDBitmap_unlockPixels(env, bitmap);}
总结
以上是内存溢出为你收集整理的Android jpeglib 和 pnglib全部内容,希望文章能够帮你解决Android jpeglib 和 pnglib所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)