Nie jestem szczególnie doświadczony w Montażu i ARM, ale udało mi się napisać kilka rutynowych czynności i chciałbym zobaczyć, jak działają na urządzeniach z Androidem wyposażonych w ARM (Nexus S). Jaka jest procedura dołączania pliku kodu zespołu do projektu Android? Czy mogę go wywołać tylko z natywnego kodu lub z Javy?Jak używać kodu ARM Assembly w projekcie Android?
Odpowiedz
Możesz połączyć się z zespołem z systemu Android, używając Java Native Interface i Android NDK.
Cedric wymienia za pomocą słowa kluczowego asm, a ja wolę dołączyć kod źródłowy zespołu. Opublikowaliśmy samouczek, aby zrobić to na mojej stronie: http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html
Możesz pobrać kod źródłowy mojego przykładu i zobaczyć, jak działa. Gdy zobaczysz działający przykład, łatwo jest go zmodyfikować do swoich potrzeb.
Myślę, że powinno to być możliwe, gdy używasz NDK, który pozwala pisać kod C/C++ zapakowany w plik .apk, a następnie uruchomić na platformie Android.
Dzięki temu będzie można użyć słowa kluczowego __asm__
w swoim kodzie C (jak wspomniano w informacji o wersji w wersji 5b).
Albo można to surowe pliki asemblera. – doron
Minimal przykład z inline i oddzielnego źródła pliku
Niektóre opieki ma być podjęta nie skompilować surowego montaż pod niewłaściwym łuku. Tutaj używamy:
#ifdef
s na plikach Cifeq
s naAndroid.mk
This example on GitHub. Testowany na Ubuntu 16.04, Android NDK 12, Sony Xperia Z3 D6643 (ARMv7) z systemem Android 5.1.1.
jni/main.c
#include <stdio.h>
#include <jni.h>
#ifdef __arm__
int asm_main(void);
#endif
jstring Java_com_cirosantilli_android_1cheat_ndk_1asm_Main_jniMethod(
JNIEnv* env, jobject thiz) {
enum Constexpr { N = 256 };
char s[N];
size_t cur = 0;
int x = 0;
#ifdef __arm__
cur += snprintf(s + cur, N - cur, "arm ");
/* Inline test. Increment x by 1. */
asm (
"add %0, #1"
: "=r" (x)
: "0" (x)
);
/* Separate source test. Increment x by 1. */
x += asm_main();
#endif
if (x == 2)
cur += snprintf(s + cur, N - cur, "%s", "0");
else
cur += snprintf(s + cur, N - cur, "%s", "1");
return (*env)->NewStringUTF(env, s);
}
jni/main_asm.S
.text
/* Function that just returns 1. */
.global asm_main
asm_main:
mov r0, #1
bx lr
jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.c
# http://stackoverflow.com/questions/12614417/android-ndk-how-to-get-compiler-architecture-in-android-mk-dynamically
ifneq (,$(filter $(TARGET_ARCH_ABI),armeabi armeabi-v7a))
LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) main_asm.S
endif
include $(BUILD_SHARED_LIBRARY)
com/cirosantilli/android_cheat/ndk_asm/Main.java
package com.cirosantilli.android_cheat.ndk_asm;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(jniMethod());
setContentView(tv);
}
public native String jniMethod();
static {
System.loadLibrary("main");
}
}
- 1. Jak załadować i używać natywnego kodu c w projekcie lein?
- 2. Jak używać kgdb na ARM?
- 3. Jak używać TagBuilder w projekcie biblioteki klas?
- 4. Jak używać prekompilowanych nagłówków w projekcie Qt
- 5. Uruchamianie plików binarnych ARM dla Androida w systemie Linux ARM
- 6. Jak wygodnie pracować w dużym projekcie (Android)?
- 7. Android Studio - "W projekcie wykryto platformę Android"
- 8. Identyfikowanie powtarzającego się kodu w projekcie PHP
- 9. Jak używać plików tlb w macierzystym projekcie C++
- 10. Rozładuj CodeDom-compiled assembly
- 11. Jak używać wyjść ARM "wartości innego zadania wydania?
- 12. Jak używać niebezpiecznego kodu w bezpiecznym konteksie?
- 13. Czy istnieje jakiś powód, aby używać javac zamiast groovyc w projekcie mieszanego kodu?
- 14. Przykładowe Android BSP (Źródło) dla ARM
- 15. jak dodać Assembly DocumentFormat.OpenXml.Wordprocessin w visual studio
- 16. Jak używać ikony czcionki (font-awesome) w selektorze kodu XML
- 17. Jak używać sterownika JDBC MySQL w projekcie SBT Scala?
- 18. Jak używać sterownika Oracle JDBC w projekcie Gradle
- 19. Co oznacza słowo kluczowe assembly w AssemblyInfo.cs. Czy pozwala używać metody w środku?
- 20. Jak mogę użyć zewnętrznego słoja w projekcie Android w NetBeans?
- 21. Jak prawidłowo utworzyć tablicę w złożeniu ARM?
- 22. C#: Custom assembly directory
- 23. Podpisywanie F # Assembly
- 24. Buduj i używaj kodu źródłowego Android Dialer open source w moim projekcie
- 25. Wywołanie systemowe w ARM
- 26. Jak używać Scala varargs z kodu Java
- 27. Jak programowo programowo uwzględnić biblioteki w projekcie Android?
- 28. Android - jak dodać adnotację @hide w moim projekcie
- 29. Jak zaimplementować/użyć typu dynamicznego w materialnym projekcie systemu Android?
- 30. Jak .gitignore app/app.iml w projekcie Android Studio?
Bardzo fajne, dzięki. – Phonon
Nie udało mi się jeszcze uruchomić kodu zespołu w moim projekcie, nawet nie wiem, czego potrzebowałem. Ale twój tutorial jest niesamowity i absolutnie warty głosowania. – Wolfen