![](/img/trans.png)
[英]Import Android JNI shared library “.so” into Java Netbeans project?
[英]Cannot get to work .so shared library in android project
android開發和java絕對是新手,所以問題可能微不足道,但我已經對嘗試或閱讀的內容或google感到困惑,因此請提供幫助。 試圖創建一個應用程序,該應用程序應該對選定的圖像集進行一些批處理。 找到了一個完全適合我需要的庫 ,將其連接起來並編寫了一個簡單的測試,該程序必須檢查一切是否正常運行:
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文件。 這是我的設置:
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,在項目根目錄的'libs'目錄中具有.so文件,在'src / main / java'中具有包裝類的'fakeawt'和'magick'文件夾,以及
static {
System.loadLibrary("imagemagick");
}
在Main.java的開頭。
任何想法可能出什么問題以及如何正確解決?
我建議您使用的Android Studio是否遵循項目結構:App |-> 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路徑。
抱歉,該問題與ndk或共享庫無關。 它只是不推薦使用的getRealPathFromUri()函數,與現代android 5+圖像選擇器一起使用時始終返回NULL值。
另外,由於某種原因,將NULL指針傳遞給JNI方法總是會導致段錯誤,因此必須事先驗證這些值。
通過根據此答案替換適當的函數並創建if-else語句來檢查返回的真實文件路徑是否為NULL來解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.