我正在尝试运行一个应用程序,但我遇到了一件奇怪的事情:该应用程序使用了一个库项目,我以这种方式将其加载到MainActivity中:
static{
System.loadLibrary("freerdp-android");
}
现在,如果我用智能手机启动应用程序,没有问题,而如果我用模拟器启动它,我会得到这个:
08-27 20:10:51.637: E/AndroidRuntime(388): FATAL EXCEPTION: main
08-27 20:10:51.637: E/AndroidRuntime(388): java.lang.ExceptionInInitializerError
08-27 20:10:51.637: E/AndroidRuntime(388): at java.lang.Class.newInstanceImpl(Native Method)
08-27 20:10:51.637: E/AndroidRuntime(388): at java.lang.Class.newInstance(Class.java:1424)
08-27 20:10:51.637: E/AndroidRuntime(388): at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
...
08-27 20:10:51.637: E/AndroidRuntime(388): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load freerdp-android: findLibrary returned null
08-27 20:10:51.637: E/AndroidRuntime(388): at java.lang.Runtime.loadLibrary(Runtime.java:425)
08-27 20:10:51.637: E/AndroidRuntime(388): at java.lang.System.loadLibrary(System.java:554)
08-27 20:10:51.637: E/AndroidRuntime(388): ... 15 more
为什么?
有些应用程序(使用play store库)只在设备上运行,而不是在谷歌默认的android模拟器上运行,原因是依赖于其他应用程序,即play store应用程序和其他原因。
所以尝试使用新的genymotion android模拟器,它几乎没有比默认模拟器更多的功能。
首先它是
System.loadLibrary("freerdp_android");
正如Esparver所写,他回答了一个类似的问题:
在Java方面,看起来应该将其他库加载为好吧,按照适当的顺序:
static { System.loadLibrary("freerdp-utils"); System.loadLibrary("freerdp-codec"); System.loadLibrary("freerdp-gdi"); System.loadLibrary("freerdp-core"); System.loadLibrary("freerdp-rail"); System.loadLibrary("freerdp-chche"); System.loadLibrary("freerdp-crypto"); System.loadLibrary("freerdp-sspi"); System.loadLibrary("freerdp-channels"); System.loadLibrary("rdpsnd_alsa"); System.loadLibrary("cliprdr"); System.loadLibrary("rdpsnd"); System.loadLibrary("freerdp_android"); System.loadLibrary("freerdp"); }
如果使用Gradle的externalNativeBuild
,则必须将模拟设备ABI添加到Application.mk
文件中的APP_ABI
变量或Gradle中的abiFilters
块中。
通常,您需要在列表中包含x86
或x86_64
。
请参阅NDK指南