摩托罗拉刚刚发布了基于x86的Android手机.关于为ARM编写的本机应用程序/库(例如netflix)如何在这款手机上运行,我有点困惑.
如果有人能解释,我将不胜感激.
我想为armv6构建我的库,如果设备支持它,我会在运行时启用一些霓虹灯代码.霓虹灯代码使用霓虹内在函数,为了能够编译它,我必须启用armeabi-v7a,但这会影响常规的c代码(它在一些低端设备上会被破坏).
因此,如果android构建系统没有过度干扰,我就不必提问,但似乎我没有办法为armv6编译一个文件而为arm7-neon编译另一个文件.
任何人都可以提供任何线索,如果这是可行的吗?
编辑
在尝试回复和浪费互联网墨水之前,应该清楚这些是要点:
1)只创建一个lib.
2)使构建在armv6(pre-neon设备,例如armeabi)上运行.
3)允许此构建还包含NEON代码(可以基于运行时cpu检测执行; cpu检测超出了问题的范围).
4) NEON代码来自ac/cpp文件,使用neon intrinsics编写.
省略这些要求的任何部分完全失去了问题的重点
该Xamarin文档是对这个有点不清楚.如果我构建我的应用程序只在构建首选项中勾选了armeabi,那么我的应用程序是:
如果它确实运行,是否有任何功能,如使用线程,将导致意外的行为或崩溃?
我有一个简单的应用程序,我试图保持它的小.另外,我没有v7a设备来进行快速实验.
澄清:
虽然似乎很明显的验收,这是"安全的,但没有这么高性能的"编译Android应用程序只与amreabi库(见这个优秀的帖子:为什么在armeabi代码中使用armeabi-V7A代码)时,Xamarin文档上CPU架构,我认为适用于自己编译的.so库,说:
需要记住的是由Xamarin.Android使用的armeabi运行时是线程安全是很重要的.如果具有armeabi支持的应用程序部署到armeabi-V7A设备,将出现许多奇怪的和无法解释的异常.
因为我已经能够测试我的应用程序,只是与armeabi编制了V7A设备上,并没有遇到任何"奇怪和无法解释的异常"呢.
更新:
看起来Xamarin文档已经更新,现在(2014-07-14)读取:
重要的是要记住Xamarin.Android使用的armeabi运行时不是线程安全的.如果将具有armeabi支持的应用程序部署到armeabi-v7a设备,则会发生许多奇怪且无法解释的异常.
我有这个C代码:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用Android NDK r4b使用-Os -mthumb编译以下拇指代码:
test:
mov r3, #1
cmp r0, #30
bgt .L3
mov r3, #0
add r0, r0, #14
bge .L3
mov r3, #2
neg r3, r3
.L3:
mov r0, r3
bx lr
Run Code Online (Sandbox Code Playgroud)
但是使用最新的Android NDK r5,它会编译成这个破碎的代码:
test:
mov r3, #1
cmp r0, #30
bgt .L3
lsl r0, r0, #24
lsr r0, …Run Code Online (Sandbox Code Playgroud) 升级到ndk 8b我收到一些崩溃报告(大多数是带有Android 4.03的Galaxy SII)
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: 1836 cannot locate '__gnu_thumb1_case_uqi'...
at java.lang.Runtime.loadLibrary(Runtime.java:370)
at java.lang.System.loadLibrary(System.java:535)
at com.iuculano.fplayer.SDLActivity.void onCreate(android.os.Bundle)(SourceFile:324)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
异常是由一个简单的引起的 System.loadLibrary("main");
这是什么意思? cannot locate '__gnu_thumb1_case_uqi'
android ×4
android-ndk ×4
arm ×2
android-x86 ×1
build ×1
gcc ×1
native ×1
neon ×1
thumb ×1
xamarin ×1