Android biblioteca JNI compilado SO lograr la completa demostración de Gauss efecto de desenfoque

de larga duración inútil biblioteca NDK JNI compilado por lo que, con el fin de impedir que la clase regalado mano con un algoritmo de Gauss necesidades de desenfoque a implementarse mano practicado recientemente. Por supuesto, este algoritmo no se dio cuenta de que me acabo de poner este código algoritmo C se compila en una biblioteca así porque C más alta eficiencia que java, ya que el algoritmo es muy adecuado para comer CPU hizo archivo SO.

NDK y JNI no descritos aquí, y yo diría que el foco se compila a partir de una biblioteca para utilizar este proceso.

La imagen de arriba se puede ver código de proceso claro C / C ++ para generar el código de la biblioteca y SO capa java llamadas por medio KJNI.

He compilado con Android Studio, debido a que es una biblioteca de Java y archivos de la biblioteca y afirma capa de carga método requiere una interfaz correspondiente para que podamos crear un módulo de biblioteca depende directamente de la parte interior de ingeniería, comenzó a explicar completar los siguientes pasos:

 

(1) crear una nueva bibliotecas dependientes necesarios para llenar el nombre del paquete

(2) el medio ambiente configuración de generación

  • Local.properties encontrar el archivo en el proyecto de la biblioteca se basa añadir posición de la herramienta NDK.

ndk.dir = / home / zhuxingchong / Android / SDK / NDK-paquete

NDK posición Archivo-> configuración de proyecto se puede encontrar a continuación

  • Para la compatibilidad con versiones anteriores NDK interdependencia entre archivos complemento gradle.properties

android.useDepreCateNdk = true

Agregar dependencias de los archivos build.gradle módulos compilados y así NDK archivos compilados mk archivo

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk{
            moduleName "jni_blur"//生成so文件名
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild{
        ndkBuild{
            path "src/main/java/jni/Android.mk"//mk文件路径
        }
    }
}

función de archivo indicado (3) java

(4) generar un archivo .h

javah -d JNI comando com.data.mylibrary.StackNative generada .h en el directorio del terminal mylibrary / src / main / java realiza

Después de la finalización de la ejecución del comando de directorio JNI será generado y el directorio de Java generado en el directorio

código del archivo .h detallado es como sigue

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_data_mylibrary_StackNative */

#ifndef _Included_com_data_mylibrary_StackNative
#define _Included_com_data_mylibrary_StackNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_data_mylibrary_StackNative
 * Method:    blurPixels
 * Signature: ([IIII)V
 */
JNIEXPORT void JNICALL Java_com_data_mylibrary_StackNative_blurPixels
  (JNIEnv *, jclass, jintArray, jint, jint, jint);

/*
 * Class:     com_data_mylibrary_StackNative
 * Method:    blurBitmap
 * Signature: (Ljava/lang/Object;I)V
 */
JNIEXPORT void JNICALL Java_com_data_mylibrary_StackNative_blurBitmap
  (JNIEnv *, jclass, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

(5) preparar .c lógica específica o archivo CPP, y el nombre de archivo puede ser cambiado .c archivo sufijo .h como CPP o puede ser, ya que es la imagen de un código de procesamiento de desenfoque gaussiano hacer más.


#include <android/log.h>
#include <android/bitmap.h>
#include "stackblur.h"

#define TAG "com_data_mylibrary_StackNative"
#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)

JNIEXPORT void JNICALL
Java_com_data_mylibrary_StackNative_blurPixels
        (JNIEnv
         *env,
         jclass obj, jintArray
         arrIn,
         jint w, jint
         h,
         jint r
        ) {
    jint *pixels;
    // cpp:
    // pix = (env)->GetIntArrayElements(arrIn, 0);
    pixels = (*env)->GetIntArrayElements(env, arrIn, 0);
    if (pixels == NULL) {
        LOG_D("Input pixels isn't null.");
        return;
    }

    // Start
    pixels = blur_ARGB_8888(pixels, w, h, r);
    // End
    (*env)->ReleaseIntArrayElements(env, arrIn, pixels, 0);
}

JNIEXPORT void JNICALL
Java_com_data_mylibrary_StackNative_blurBitmap
        (JNIEnv
         *env,
         jclass obj, jobject
         bitmapIn,
         jint r
        ) {
    AndroidBitmapInfo infoIn;
    void *pixels;

    // Get image info
    if (AndroidBitmap_getInfo(env, bitmapIn, &infoIn) != ANDROID_BITMAP_RESULT_SUCCESS) {
        LOG_D("AndroidBitmap_getInfo failed!");
        return;
    }

    // Check image
    if (infoIn.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
        infoIn.format != ANDROID_BITMAP_FORMAT_RGB_565) {
        LOG_D("Only support ANDROID_BITMAP_FORMAT_RGBA_8888 and ANDROID_BITMAP_FORMAT_RGB_565");
        return;
    }

    // Lock all images
    if (AndroidBitmap_lockPixels(env, bitmapIn, &pixels) != ANDROID_BITMAP_RESULT_SUCCESS) {
        LOG_D("AndroidBitmap_lockPixels failed!");
        return;
    }
    // height width
    int h = infoIn.height;
    int w = infoIn.width;

    // Start
    if (infoIn.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
        pixels = blur_ARGB_8888((int *) pixels, w, h, r);
    } else if (infoIn.format == ANDROID_BITMAP_FORMAT_RGB_565) {
        pixels = blur_RGB_565((short *) pixels, w, h, r);
    }
    // End
    // Unlocks everything
    AndroidBitmap_unlockPixels(env, bitmapIn);
}

(6) la preparación de documentos mk

Android.mk

LOCAL_PATH		:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jni_blur //生成so文件名
LOCAL_SRC_FILES := stackblur.c com_data_mylibrary_StackNative.c load.c //所有需要编译的c/cpp文件
LOCAL_LDLIBS    := -lm -llog -ljnigraphics

include $(BUILD_SHARED_LIBRARY)

Aplication.mk

APP_ABI		:= all
APP_PLATFORM:= android-23
APP_OPTIM	:= release

(7) compilado por lo AAR archivo y archivo de paquete

Haga clic en Android Studio lado derecho gradle-> mylibrary-> acumulación> acumulación

Generar la ubicación del archivo de biblioteca adecuada

(8) la respuesta hasta el archivo de AAR y copiar el archivo de proyecto de su proyecto libs

(9) dispuesto última en la correlación dependiente que puede ser usado build.gradle

 

nota:

archivos de cabecera generados cuando se ejecuta javah -d JNI com.data.mylibrary.StackNative de error

Error: No se puede determinar la firma de mapa de bits

public static blurBitmap nativa vacío (mapa de bits de mapa de bits, int r); 改为
public static blurBitmap nativa vacío (mapa de bits del objeto, int r);

Última Fuente: Android-Jni_demo

 

Publicado 92 artículos originales · ganado elogios 27 · Vistas a 90000 +

Supongo que te gusta

Origin blog.csdn.net/zhuxingchong/article/details/89217985
Recomendado
Clasificación