2016-11-15 74 views
0

對於android開發和java來說絕對是新的,所以這個問題可能是微不足道的,但我已經對要嘗試或閱讀的內容感到困惑,所以請幫助。試圖創建一個應該對選定的一組圖像進行批處理的應用程序。發現一個library完美地適合我的需要,連接它,並寫了一個簡單的測試,這不得不看看是否一切正常,因爲它應該:無法在Android項目中工作.so共享庫

if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK && null != data) { 
     Uri selectedImageUri = data.getData(); 
     m_ImagePath = getRealPathFromUri(selectedImageUri); 

     try { 
      m_MagickImage = new MagickImage(new ImageInfo(m_ImagePath)); 
      m_EffectImage = m_MagickImage.rotateImage(90); 
      m_Bitmap = MagickBitmap.ToReducedBitmap(m_EffectImage, 1000); 
     } catch (MagickException e) { 
      Log.d(LOGTAG, e.toString()); 
     } 

     ImageView imageview = (ImageView) findViewById(R.id.imageView); 
     imageview.setImageBitmap(m_Bitmap); 
     //imageview.setImageURI(selectedImageUri); 

     openFileButton.setVisibility(View.GONE); 
    } 

項目編譯沒有警告完全沒問題,但是當我部署它真正的硬件和分配給筆試按下按鈕,我得到了logcat中出現以下錯誤:更多的系統信息和警告(不認爲他們是重要的,但可以提供所需的按需一切)

JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring 
    in call to GetStringUTFChars 
    from void magick.ImageInfo.setFileName(java.lang.String) 
    "main" prio=5 tid=1 Runnable 

和200串。

也是運行後我得到了很多的紅色警告信息,如

cannot resolve corresponding jni function Java_magick_ImageInfo_setFileName 

在與Android的ImageMagick的幾乎所有的java文件。

庫連接爲.jar文件,按照this線程中的說明操作。這裏是我的設置:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.0.0' 
    compile 'com.android.support:design:25.0.0' 
    testCompile 'junit:junit:4.12' 
} 

sourceSets { 
     main { 
      java.srcDirs = ['src/main/java'] 
     } 
    } 

在的build.gradle。

armeabi.jar與.so文件 '庫' 項目, 'fakeawt' 和根目錄 'magick' 文件夾,在「的src/main/Java的包裝類,並

static { 
     System.loadLibrary("imagemagick"); 
    } 

在Main.java的開頭。

任何想法可能會出錯,以及如何正確解決它?

回答

0

對不起,這個問題與ndk或共享庫無關。它只是被棄用的getRealPathFromUri()函數,它總是在與現代的Android 5+圖像選擇器一起使用時返回NULL值。

同時將NULL指針傳遞給JNI方法總是會由於某種原因導致段錯誤,所以這些值必須事先進行驗證。

通過根據this替換適當的函數來解決答案並創建if-else語句來檢查是否返回真實文件路徑不爲NULL。

0

我建議,如果您使用的是Android工作室按照項目結構: 應用 | - > SRC | - > jnilibs 這裏複製所有與從https://github.com/paulasiimwe/Android-ImageMagick/tree/master/libs的文件夾並粘貼到jnilibs(LIBS) 不是增加後續行在應用的build.gradle

sourceSets.main { 
jniLibs.srcDir 'src/main/libs' // use the jni .so compiled from the manual ndk-build command 
jni.srcDirs = [] //disable automatic ndk-build call 
} 

同步gradle這個

不要在你的項目中複製文件的JNI,這是在溴化鋰自定義更改元。 從設置中設置NDK路徑。