【发布时间】:2013-10-28 11:52:55
【问题描述】:
我尝试使用来自 Android 的 ARM 代码,使用 JNI。下载完所有内容(NDK、工具链)后,我打开了名为 hello-jni 的示例 NDK 项目。构建后,它运行良好。现在我尝试使用一些 ARM。 我找到了一个 hello-world ARM 示例:
.align 2
.global armFunction
.type armFunction, %function
armFunction:
stmfd sp!, {fp,ip,lr}
mov r3, r0, asl #3
add r0, r3, r0, asl #1
ldmfd sp!, {fp,ip,lr}
bx lr
.size armFunction, .-armFunction
我修改了C源代码,添加了一个函数:
jint
Java_com_example_hellojni_HelloJni_factorialJNI(
JNIEnv* env, jobject object, jint input) {
return armFunction(input);
}
我也修改了 Android.mk 文件:
LOCAL_SRC_FILES := hello-jni.c multiple.S
之后,我使用 ndk-build 构建本机代码, 我有一个错误:
c:\android\hello-jni\ndk-build
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbserver
Gdbsetup : libs/armeabi-v7a/gdb.setup
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Gdbserver : [x86-4.6] libs/x86/gdbserver
Gdbsetup : libs/x86/gdb.setup
Gdbserver : [mipsel-linux-android-4.6] libs/mips/gdbserver
Gdbsetup : libs/mips/gdb.setup
"Compile arm : hello-jni <= hello-jni.c
"Compile arm : hello-jni <= multiple.S
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
"Compile arm : hello-jni <= hello-jni.c
"Compile arm : hello-jni <= multiple.S
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
"Compile x86 : hello-jni <= hello-jni.c
"Compile x86 : hello-jni <= multiple.S
jni/multiple.S: Assembler messages:
jni/multiple.S:6: Error: no such instruction: `stmfd sp!,{fp,ip,lr}'
jni/multiple.S:7: Error: too many memory references for `mov'
jni/multiple.S:8: Error: too many memory references for `add'
jni/multiple.S:9: Error: no such instruction: `ldmfd sp!,{fp,ip,lr}'
jni/multiple.S:10: Error: no such instruction: `bx lr'
make: *** [obj/local/x86/objs-debug/hello-jni/multiple.o] Error 1
为什么这些说明不起作用? 我应该单独编译ARM代码吗?我想,ndk-build 会构建它。
--编辑 我的 application.mk 文件:
APP_ABI := all
【问题讨论】:
-
为什么您的构建尝试编译到 x86 平台?这可能是您的错误背后的原因:stmfd 和 ldtmfd 是 ARM 指令,而不是 x86 指令。 libs/armeabi-v7a/libhello-jni.so 工作吗?
-
我修改了帖子,只是在application.mk中有一行,我对Android原生东西很陌生,所以这是我第一次尝试,我只是尝试了一种hello-world- android-asm 我在互联网上找到的。我在 Windows 8 64bit 上,我想将它构建到 Android 4.3,我会在我的手机上尝试它,而不仅仅是在 emu 上(但首先在 emu 上没问题)而不使用任何 ARM 东西,JNI 本身运行良好
-
如果有人能给我一个工作的 ARM 示例,我可以在 Android 下从 JNI 调用它,我也可以!我要实现的是从我的 Android 手机调用 ARM 指令
-
是的,您正在为所有架构进行编译。如果您只想要 arm,请在 Application.mk 中使用
APP_ABI := armeabi -
其实可以的!这就是问题所在,非常感谢!现在我可以看到 ARM Assembly 的阶乘结果,在我的 Activity 窗口上想 JNI。也许你应该把它写成答案,我不能接受。
标签: android c android-ndk arm