Wie benutzt man ARM Assembly-Code in einem Android-Projekt?

Ich bin nicht besonders mit Assembly und ARM erlebt, aber ich konnte ein paar Routinen darin schreiben und ich würde gerne sehen, wie sie auf einem ARM-ausgerüsteten Android-Gerät laufen (Nexus S). Was ist das Verfahren für die Aufnahme einer Assembly-Code-Datei in ein Android-Projekt? Kann ich es nur aus nativem Code oder aus Java auch anrufen?

  • Gibt es eine Art Firebug oder JavaScript-Konsolen-Debug für Android?
  • So erstellen Sie eine völlig benutzerdefinierte Dialog / Popup in Android (ändern Overlay Farbe und Dialogfenster Layout)
  • Wie lese ich die eingehende Nachricht mit Service im Hintergrund in Android?
  • Lesen Sie alle SMS von einem bestimmten Absender
  • GreenDao Schema Upgrade
  • Strange "nameValuePairs" -Taste erscheint bei Verwendung von Gson
  • Wie zu messen und zu verbessern Batterie verwenden im iPhone / iPad Spiel (Android auch)
  • Android - mehrere benutzerdefinierte Versionen der gleichen App
  • Bildschirm blinkt zufällig beim Verwenden von overridePendingTransition auf Jelly Bean
  • Kann Android-Unterstützung dp weniger als 1dp?
  • Facebook fragt nach Android-Key-Hashes für App, die sich noch im Sandbox-Modus befindet
  • Wie zu debugieren apk für die Freigabe unterzeichnet?
  • 3 Solutions collect form web for “Wie benutzt man ARM Assembly-Code in einem Android-Projekt?”

    Sie können die Montage von Android mit dem Java Native Interface und dem Android NDK aufrufen.

    Cedric erwähnt das asm- Schlüsselwort, während ich es vorziehe, den Versionsquellcode einzuschließen. Ich habe ein Tutorial, um dies auf meiner Website zu tun: http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html

    Sie können den Quellcode für mein Beispiel herunterladen und sehen, wie es funktioniert. Sobald Sie ein funktionierendes Beispiel sehen, ist es einfach, es auf Ihre Bedürfnisse zu ändern.

    Ich denke, das sollte bei der Verwendung der NDK möglich sein , die es Ihnen erlaubt, C / C ++ – Code zu schreiben, der in einer .apk verpackt ist und dann auf der Android-Plattform läuft.

    Damit kannst du das __asm__ Schlüsselwort in deinem C-Code verwenden (wie in den Versionshinweisen der Revision 5b erwähnt).

    Minimales Beispiel mit Inline und separater Quelldatei

    Es ist darauf zu achten, dass die Rohbaugruppe unter dem falschen Bogen nicht kompiliert wird. Hier verwenden wir:

    • #ifdef s auf C-Dateien
    • ifeq s auf Android.mk

    Dieses Beispiel auf GitHub . Getestet auf Ubuntu 16.04, Android NDK 12, Sony Xperia Z3 D6643 (ARMv7) mit 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"); } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.