Переключение на native, чтобы повысить производительность и скорость обработки, но, к сожалению, мое приложение слишком медленно. Кроме того, при загрузке изображений с высоким разрешением приложение выходит из строя.jni - Медленная обработка в native
Вот мой полный код для вас, чтобы рассказать мне, как его улучшить.
код Java:
package com.example.invert;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
ImageView imageView2;
double[][][] imgArray;
int w, h;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView2 = (ImageView) findViewById(R.id.imageView1);
imageView2.setDrawingCacheEnabled(true);
BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView2
.getDrawable();
final Bitmap bitmap = bitmapDrawable.getBitmap();
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
w = bitmap.getWidth();
h = bitmap.getHeight();
imgArray = new double[w][h][3];
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
imgArray[i][j][0] = Color.red(bitmap.getPixel(i, j));
imgArray[i][j][1] = Color.green(bitmap.getPixel(i, j));
imgArray[i][j][2] = Color.blue(bitmap.getPixel(i, j));
}
}
imgArray = inv(imgArray, w, h);
Bitmap newBitmap = Bitmap.createBitmap(w, h, bitmap.getConfig());
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
newBitmap.setPixel(i, j, Color.rgb(
(int) (imgArray[i][j][0]),
(int) (imgArray[i][j][1]),
(int) (imgArray[i][j][2])));
}
}
imageView2.setImageBitmap(newBitmap);
}
});
}
static {
System.loadLibrary("inv");
}
// internal, private
public native double[][][] inv(double[][][] inputArr, int w, int h);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
код С:
#include <jni.h>
#include <stdio.h>
#include<stddef.h>
JNIEXPORT jobjectArray JNICALL Java_com_example_invert_MainActivity_inv
(JNIEnv *env, jobject obj, jobjectArray arr, jint w, jint h){
double sum = 0;
int i,j,k;
double a[w][h][3];
jsize dim1 = (*env)->GetArrayLength(env, arr);
for (i=0; i<w; i++){
jdoubleArray *line1 = (*env)->GetObjectArrayElement(env, arr, i);
int dim2 = (*env)->GetArrayLength(env, line1);
jdouble *pos1 = (*env)->GetDoubleArrayElements(env, line1, 0);
for (j=0; j<h; j++){
jdoubleArray *line2 = (*env)->GetObjectArrayElement(env, line1, j);
int dim3 = (*env)->GetArrayLength(env, line2);
jdouble *pos2 = (*env)->GetDoubleArrayElements(env, line2, 0);
for (k=0; k<dim3; k++){
a[i][j][k]= pos2[k];
}
(*env)->ReleaseDoubleArrayElements(env, line2, pos2, 0);
(*env)->DeleteLocalRef(env, line2);
}
(*env)->ReleaseDoubleArrayElements(env, line1, pos1, 0);
(*env)->DeleteLocalRef(env, line1);
}
jclass doubleArrayArrayClass = (*env)->FindClass(env,"[[D");
jclass doubleArrayClass = (*env)->FindClass(env,"[D");
jobjectArray ret = (*env)->NewObjectArray(env,w, doubleArrayArrayClass, NULL);
for(i = 0; i<w; i++){
for(j = 0; j<h; j++){
for(k = 0; k<3; k++){
a[i][j][k] = 255 - a[i][j][k];
}
}
}
for(i = 0; i<w; i++){
jobjectArray dim2 = (*env)->NewObjectArray(env, w, doubleArrayClass, NULL);
for(j = 0; j<h; j++) {
jdoubleArray dim1 = (*env)->NewDoubleArray(env,h);
jdouble tmp[3];
for(k = 0; k<3; k++){
tmp[k] = a[i][j][k];
}
(*env)->SetDoubleArrayRegion(env,dim1 , 0, h, tmp);
(*env)->SetObjectArrayElement(env, dim2, j, dim1);
(*env)->DeleteLocalRef(env, dim1);
}
(*env)->SetObjectArrayElement(env,ret, i, dim2);
(*env)->DeleteLocalRef(env,dim2);
}
return ret;
}
Вы должны уточнить, что происходит, когда приложение «сбой». Получают ли сообщения трассировки или ошибки. Что касается медленного, вы должны узнать, как профилировать свой код, чтобы узнать, где он занимает больше всего времени. –
[* Попробуйте это. *] (Http://stackoverflow.com/a/378024/23771) Это не вопрос выяснить *, где * это занимает больше всего времени, но * почему *. –