![](/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.