在Android Studio上使用ARM64-v8a的汇编语言

时间:2018-04-26 21:18:35

标签: android c++ android-studio android-ndk java-native-interface

我正在使用ARM64-v8a上的Android工作室构建Android应用,可以请求汇编功能。 在线搜索了大量信息后,我仍然无法解决这个问题。

  

我的CMakeList.txt如下:

cmake_minimum_required(VERSION 3.4.1)

enable_language(ASM)
set(can_use_assembler TRUE)
set(CMAKE_VERBOSE_MAKEFILE on)
#add_definitions(-DANDROID -DNDEBUG -DOC_ARM_ASM)

set_source_files_properties(multiple.s PROPERTIES COMPILE_FLAGS "-x 
assembler-with-cpp")

add_library( # Sets the name of the library.
         native-lib

         # Sets the library as a shared library.
         SHARED

         # Provides a relative path to your source file(s).
         src/main/cpp/native-lib.cpp
         src/main/cpp/multiple.s
         )
  

multiple.s的代码为

.session .text
.align  2
.global armFunction
.type   armFunction, %function

armFunction:
    @ Multiply by 10. Input value and return value in r0
    stmfd   sp!, {fp,ip,lr}
    mov r3, r0, asl #3  @ r3=r0<<3=r0*8
    add r0, r3, r0, asl #1  @ r0=r3+r0<<1=r0*8+r0*2=r0*10
    ldmfd   sp!, {fp,ip,lr}
    bx  lr
    .size   armFunction, .-armFunction
  

native-lib.cpp的代码如下:

extern "C"

int armFunction(int);

JNIEXPORT jstring JNICALL
Java_com_example_zyf_testarm_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++ ";
    int x = 1;
    char info[1024] = "";
    x = x + armFunction(10);

    sprintf(info,"%d",x);
    return env->NewStringUTF(info); //hello.c_str()
}

错误信息是

  

错误:未知指令     .session .text

     

错误:语句开头的意外令牌         @乘以10.输入值和返回值r0

这些只是错误消息的一部分。实际上,它表明multiple.s中的每条指令都是unknown

更新

  

有人指出问题可能是case sensitive。所以我尝试使用另一个名为.S的{​​{1}}文件。   main_asm.S的代码如下:

main_asm.S

问题仍然存在:

  

未知指令

更新

我提出了另一个问题Question Link

我认为问题是由同样的原因引起的。也许我的.text .global asm_main asm_main: mov r0, #1 bx lr 效果不佳?我不知道,请帮忙:)。

非常感谢帮助我解决这个问题:)

2 个答案:

答案 0 :(得分:2)

bx lr 和寄存器 r0..r15 是 32 位 ARM,而不是 AArch64 / ARM64-v8a。 ARM64 寄存器是 x0..31(它们的低半部分是 w0..31),然后返回 retbr 的别名)

确保 64 位构建不会尝试构建 32 位 asm 源文件。
或者,如果您有 32 位 asm 源代码,请确保您只进行 32 位构建。

答案 1 :(得分:1)

我在Android Studio(V3.1.2)中遇到了相同的问题“ unknown token / instruction / ...”,并使用abiFilters(在app / build.gradle中)解决了该问题,但未引用ndk:

android {
...
    defaultConfig {
...
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }}}
...    
}

(也许将armeabi-v7a更改为arm64-v8a)

希望有帮助

(您可以在此处查看项目:https://github.com/denisb/GPerf