2013-10-04 3 views
14

Я никогда не работал над ndk. Но у меня есть проект, в котором используется ndk.Не удается запустить программу « ndk-build.cmd»: Запуск неудачен

это дает мне java.lang.UnsatisfiedLinkError: Native method not found:

Я пытался искать в Google. У меня много ссылок Но все они связаны с jni.cpp file Но моя ошибка в java-файле. Поэтому я не могу найти, как исправить это.

"java.lang.UnsatisfiedLinkError: Native method not found: il.co.telavivapp2u.onceapponatime.SharedResources.ocvBitmapPreMultAlpha:(Landroi‌​‌​d/graphics/Bitmap;Landroid/graphics/Bitmap;) 

Я включил NDK после this link. Этот проект выполняется другим разработчиком Мы добавляем в него еще несколько функций. Эта часть выполняется предыдущим разработчиком.

Я только что добавил действие API поиска Google и изображение галереи. Активность, которая будет отображать изображения в сетке. предыдущий dev поместил некоторое количество изображений в папку с возможностью переноса и показывая его в виде галереи. он отлично работает, что бы он ни делал в его конце. даже сейчас тоже. Но то, что я добавил в том, что то же самое не происходит

После нажатия на изображении в галерее в приложении можно перейти к активности камеры, которая будет захватывать изображение с выбранным изображением в качестве фона. и затем мы можем редактировать и сохранять это изображение. Но в случае мобильной галереи и поисковых изображений Google после захвата приложения идет ANR.

Я установил путь NDK и переменную затмить также я установил с C++ плагинов

Также консоль показывает

Cannot run program "\ndk-build.cmd": Launching failed . 

Я не могу понять, где я делаю ошибку. Пожалуйста, помогите мне.

JNI FILE

НРУ происходит на номер строки 207.

Вот мой код:

package il.co.telavivapp2u.onceapponatime; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Point; 
import android.os.Environment; 
import android.util.Log; 
import android.view.Display; 

public class SharedResources { 
    public static Bitmap bmpOld = null; 
    public static Bitmap bmpOldScaled = null; 
    public static Bitmap bmpNew = null; 
    public static Bitmap bmpNewScaled = null; 

    public static int scaledX = 0, scaledY = 0; 
    public static int dispX = 0, dispY = 0; 
    public static int fullX = 0, fullY = 0; 
    public static int picX = 0, picY = 0; 

    public static String fileDir = "/OnceAppOnATime/"; 
    public static String fileTempDir = fileDir + "/.temp/"; 
    public static String fileTempNew = fileTempDir + "/temp-new.jpg"; 
    public static String fileTempOld = fileTempDir + "/temp-old.jpg"; 
    public static String fileTempMask = fileTempDir + "/temp-mask.jpg"; 
    public static String fileTempBlend = fileTempDir + "/temp-blend.jpg"; 
    public static String fileTempRetouch = fileTempDir + "/temp-retouch.jpg"; 
    //public static String fileLastBlend = ""; 

    public static BitmapFactory.Options op = new BitmapFactory.Options(); 

    public static Locale localeHebrew = null; 

    public static int taskID = -1; 

    public static boolean Init(Activity activity) { return Init(activity, false); } 
    @SuppressLint("NewApi") 
    @SuppressWarnings("deprecation") 
    public static boolean Init(Activity activity, boolean force) { 
     if (dispX > 0 && dispY > 0) { // Don't re-init to avoid wrong file names 
      if (!force) 
       return false; 
     } else { 
      fileDir = Environment.getExternalStorageDirectory() + fileDir; 
      fileTempDir = Environment.getExternalStorageDirectory() + fileTempDir; 
      fileTempNew = Environment.getExternalStorageDirectory() + fileTempNew; 
      fileTempOld = Environment.getExternalStorageDirectory() + fileTempOld; 
      fileTempMask = Environment.getExternalStorageDirectory() + fileTempMask; 
      fileTempBlend = Environment.getExternalStorageDirectory() + fileTempBlend; 
      fileTempRetouch = Environment.getExternalStorageDirectory() + fileTempRetouch; 
     } 

     taskID = activity.getTaskId(); 

     // Find Hebrew locale, if available 
     Locale availableLocales[] = Locale.getAvailableLocales(); 
     for (int i = 0; i < availableLocales.length; ++i) { 
      String lang = availableLocales[i].getLanguage(); 
      if (lang.equals("he") || lang.equals("iw")) { 
       localeHebrew = availableLocales[i]; 
       break; 
      } 
     } 

     op.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     //op.inScaled = false; // Not needed if loading bitmaps from drawable-nodpi 
     op.inMutable = true; 

     Display display = activity.getWindowManager().getDefaultDisplay(); 
     if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB_MR2) { 
      dispX = display.getWidth(); 
      dispY = display.getHeight(); 
     } else { 
      Point dispSize = new Point(); 
      display.getSize(dispSize); 
      dispX = dispSize.x; 
      dispY = dispSize.y; 
     } 
     Log.w("Display Size", dispX + "x" + dispY); 
     //scaledX = dispX/2; scaledY = dispY/2; 
     scaledX = dispX; scaledY = dispY; 

     return true; 
    } 

    public static void setLocale(Activity activity, Locale locale) { 
     // This doesn't work reliably 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     activity.getBaseContext().getResources().updateConfiguration(config, 
      activity.getBaseContext().getResources().getDisplayMetrics()); 
    } 

    public static boolean haveScaling() { 
     return (dispX != scaledX || dispY != scaledY); 
    } 

    public static void SaveTempBitmap(Bitmap bitmap, String filename) { 
     try { 
      new File(fileTempDir).mkdirs(); 
      FileOutputStream out = new FileOutputStream(filename); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 98, out); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void RecycleOldBitmaps(boolean full, boolean scaled) { 
     if (full && bmpOld != null) { 
      bmpOld.recycle(); 
      bmpOld = null; 
     } 
     if (scaled && bmpOldScaled != null) { 
      bmpOldScaled.recycle(); 
      bmpOldScaled = null; 
     } 
    } 
    public static void RecycleNewBitmaps(boolean full, boolean scaled) { 
     if (full && bmpNew != null) { 
      bmpNew.recycle(); 
      bmpNew = null; 
     } 
     if (scaled && bmpNewScaled != null) { 
      bmpNewScaled.recycle(); 
      bmpNewScaled = null; 
     } 
    } 

    //            0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
    public static int sample2sample[] = new int[] {1, 1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 16, 
     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}; 
    public static Bitmap LoadScaledBitmap(Context ctx, int resId, float fracX, float fracY) { 
     // See: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 
     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(ctx.getResources(), resId, opts); 
     int imageHeight = opts.outHeight; 
     int imageWidth = opts.outWidth; 

     float requestX = dispX * fracX, requestY = dispY * fracY; 
     opts.inSampleSize = (int)(Math.min(imageWidth/requestX, imageHeight/requestY)); 
     if (opts.inSampleSize < 0 || opts.inSampleSize > 32) // Sometimes index=2147483647 for some reason... 
      opts.inSampleSize = 1; 
     opts.inSampleSize = sample2sample[opts.inSampleSize]; 
     Log.w("Bitmap Decoder", "Samples: " + opts.inSampleSize); 

     opts.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     //opts.inScaled = false; // Not needed if loading bitmaps from drawable-nodpi 
     opts.inMutable = true; 
     opts.inJustDecodeBounds = false; 
     return BitmapFactory.decodeResource(ctx.getResources(), resId, opts); 
    } 
    public static Bitmap LoadScaledBitmap(String filename, float fracX, float fracY) { 
     // See: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 
     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(filename, opts); 
     int imageHeight = opts.outHeight; 
     int imageWidth = opts.outWidth; 

     float requestX = dispX * fracX, requestY = dispY * fracY; 
     opts.inSampleSize = (int)(Math.min(imageWidth/requestX, imageHeight/requestY)); 
     if (opts.inSampleSize < 0 || opts.inSampleSize > 32) // Sometimes index=2147483647 for some reason... 
      opts.inSampleSize = 1; 
     opts.inSampleSize = sample2sample[opts.inSampleSize]; 
     Log.w("Bitmap Decoder", "Samples: " + opts.inSampleSize); 

     opts.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     //opts.inScaled = false; // Not needed if loading bitmaps from drawable-nodpi 
     opts.inMutable = true; 
     opts.inJustDecodeBounds = false; 
     return BitmapFactory.decodeFile(filename, opts); 
    } 

    public static String FileNameNow() { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.ENGLISH); 
     return fileDir + sdf.format(new Date()) + ".jpg"; 
    } 

    public static native void ocvBitmapPyramidalBlend(String fNew, String fOld, String fMask, String fBlend, int levels); 
    public static String ocvBitmapPyramidalBlendTimed(int levels) { 
     String fBlend = fileTempBlend;//FileNameNow(); 

     long t = System.nanoTime(); 
     ocvBitmapPyramidalBlend(fileTempNew, fileTempOld, fileTempMask, fBlend, levels); 
     long dt = (System.nanoTime() - t)/1000; // Microseconds 
     Log.w("OpenCV", "Blended (pyramidal) bitmaps in " + (dt/1000.0f) + " ms"); 

     //fileLastBlend = fBlend; 
     return fBlend; 
    } 

    public static native void ocvBitmapPreMultAlpha(Bitmap bitmapImg, Bitmap bitmapMask); 
    public static void ocvBitmapPreMultAlphaTimed(Bitmap bitmapImg, Bitmap bitmapMask) { 
     long t = System.nanoTime(); 
     ocvBitmapPreMultAlpha(bitmapImg, bitmapMask); 
     long dt = (System.nanoTime() - t)/1000; // Microseconds 
     Log.i("Native", "Applied premultiplied alpha to bitmap in " + (dt/1000.0f) + " ms"); 
    } 

    public static native void ocvBitmapContrastSaturationSet(Bitmap bitmapImg); 
    public static void ocvBitmapContrastSaturationSetTimed(Bitmap bitmapImg) { 
     long t = System.nanoTime(); 
     ocvBitmapContrastSaturationSet(bitmapImg); 
     long dt = (System.nanoTime() - t)/1000; // Microseconds 
     Log.i("Native", "Assigned contrast/saturation bitmap in " + (dt/1000.0f) + " ms"); 
    } 

    public static native void ocvBitmapContrastSaturationSrc(Bitmap bitmapImg, Bitmap bitmapSrc, float contrast, float saturation); 
    public static void ocvBitmapContrastSaturationSrcTimed(Bitmap bitmapImg, Bitmap bitmapSrc, float contrast, float saturation) { 
     long t = System.nanoTime(); 
     ocvBitmapContrastSaturationSrc(bitmapImg, bitmapSrc, contrast, saturation); 
     long dt = (System.nanoTime() - t)/1000; // Microseconds 
     Log.i("Native", "Applied contrast/saturation (from src) to bitmap in " + (dt/1000.0f) + " ms"); 
    } 

    public static native void ocvBitmapContrastSaturation(Bitmap bitmapImg, float contrast, float saturation); 
    public static void ocvBitmapContrastSaturationTimed(Bitmap bitmapImg, float contrast, float saturation) { 
     long t = System.nanoTime(); 
     ocvBitmapContrastSaturation(bitmapImg, contrast, saturation); 
     long dt = (System.nanoTime() - t)/1000; // Microseconds 
     Log.i("Native", "Applied contrast/saturation to bitmap in " + (dt/1000.0f) + " ms"); 
    } 

} 

Также right click on project - >Android Tools -> Add Native Support

Add Native Support is missing. I have Android Native Development Tools installed. Then also it's missing. 
+2

Похоже, что у вас неправильный путь для ndk-build, настроенного в вашем ide. Затем проверьте с помощью zip-файлов, что один или несколько файлов .so попадают в .apk. Наконец, вы явно загружаете библиотеку из Java? –

+0

«D: \ NDK \ android-ndk-r9» это мой путь к NDk, и я установил его в своем идеале. @ChrisStratton – TheLittleNaruto

+0

Поскольку этот проект выполняется другим разработчиком, поэтому я не уверен, в какой библиотеке вы говорите. Но да, есть две папки в папке libs проекта, один - «армеаби», а другой - «armeabi-v7a». и каждая папка содержит два файла .so. один - «libOAOAT.so», а другой - «libopencv_java.so». Также есть одна библиотека, которая используется «OpenCV Library - 2.4.3», в той же рабочей области. @ChrisStratton – TheLittleNaruto

ответ

1

UnsatisfiedLinked ошибка происходит из-за к сломанному мосту между классом java и классом c; Имя метода в java должно соответствовать методу в классе C/C++. Хотя компиляция моста создается между Java и c/C++, поэтому, если имя метода неверно, это не ответ. пример следующий метод имени injava следит

public native String Stub(){} 

, которые должны быть одинаковыми в JNI, но с Application PackageName + имя класса + MethodName как следующий

JNIEXPORT jstring JNICALL Java_com_packageName_ClassName_MethodName 
+0

Я добавил файл JNI и SharedResources тоже. имя функции равно Это в SharedResources public static native void ocvBitmapPreMultAlpha (Bitmap bitmapImg, Bitmap bitmapMask); и в файле JNI это то же самое – TheLittleNaruto

+0

поделитесь своим кодом обоих методов с Java и JNI –

+0

Я думаю, что поделился уже увиденным ниже. – TheLittleNaruto

-1

Ключом ошибка «Не удается запустить программу» ndk-build ": запуск завершен". Если это не выполняется, .so не создается, что приводит к UnsatisfiedLinkError. Сначала разрешите проблему ndk-build.

Попробуйте удалить начальный '\' из "\ ndk-build.cmd". Когда я запускаю «ndk-build.cmd», он работает.

+0

Это уже было подробно освещено в комментариях. Плакат утверждает, что файл .so присутствует в apk - хотя, возможно, и не так окончательно (в текущей версии) и т. Д. По сути, этот вопрос дает все основания отказаться от прошлой осени. –

+0

Все, что я видел, это люди, относящиеся к изменениям кода Java, которые, по их мнению, могут потребоваться, и предложения по исправлению пути к NDK. Ни один из них не помог мне. Удаление слэш работало, и никто больше не предлагал этого. – DrChandra

+0

Этот вопрос был предложен в ** первом комментарии **, опубликованном пять месяцев назад. –

Смежные вопросы