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