android - 使用 ARM 代码的 hello world jni

标签 android c android-ndk arm

我尝试使用来自 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 构建 native 代码, 我收到一个错误:

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

最佳答案

您正在为所有架构进行编译。如果您只想为 ARM 编译,请在您的 Application.mk 文件中使用 APP_ABI := armeabi

查看 NDK 安装中的 docs/APPLICATION-MK.html 以获取更多信息。

关于android - 使用 ARM 代码的 hello world jni,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634130/

相关文章:

android - 什么时候在 NDK 中调用全局变量的 C++ 析构函数?

java - stringByEvaluatingJavascriptFromString(iOS 方法,Android 等效方法是什么?)

android - OSGi(费利克斯): Change standard packages of system bundle to make it run on Android

c - 添加/附加文本到文件中的行末尾

c - 这段c代码中的奇怪行为是什么?

c++ - 在 C++ 中引用 C 结构

android - 将 AudioTrack 与 JLayer 解码器一起使用

android - 是否可以在 Android 框架(库)中封装权限

c - 在 C 中使用 fread 时,读取 block 大小是否有限制?

opencv - 在 cmakelists.txt android 中添加 opencv