Используйте ассемблер ARM64-v8a на Android Studio - PullRequest
0 голосов
/ 27 апреля 2018

Я создаю приложение для Android со студией Android на ARM64-v8a, которое может запрашивать функции сборки. После поиска большого количества информации в Интернете я все еще не могу решить эту проблему.

Мой 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 с именем main_asm.S. Код main_asm.S выглядит следующим образом:

.text
.global asm_main
 asm_main:
    mov r0, #1
    bx lr

Проблемы все еще существуют:

Неизвестная инструкция

Обновление:

Я поднимаю еще один вопрос Ссылка на вопрос .

Я думаю, что проблема вызвана той же самой причиной. Может быть, мой clang не работает? Я не знаю, пожалуйста, помогите:)

Большое спасибо за помощь в решении этой проблемы:)

1 Ответ

0 голосов
/ 18 октября 2018

У меня та же проблема "неизвестный токен / инструкция / ..." в Android Studio (V3.1.2), и я решил ее с помощью abiFilters (в app / build.gradle), но без ссылки на ndk:

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

(возможно, изменить armeabi-v7a на arm64-v8a)

надеюсь, это поможет

(проект можно посмотреть здесь: https://github.com/denisb/GPerf)

...