खोज…


एंड्रॉइड के लिए देशी निष्पादनयोग्य बिल्डिंग

परियोजना / JNI / main.c

#include <stdio.h>
#include <unistd.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}

परियोजना / JNI / Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)

परियोजना / JNI / Application.mk

APP_ABI := all
APP_PLATFORM := android-21

यदि आप 5.0 (API 21) से कम Android संस्करण चलाने वाले उपकरणों का समर्थन करना चाहते हैं, तो आपको अपने बाइनरी को APP_PLATFORM साथ पुराने API, जैसे कि android-8 सेट करना होगा। यह एंड्रॉइड 5.0 एन्फोर्सिंग पोजिशन इंडिपेंडेंट बायनेरिज़ (पीआईई) का परिणाम है, जबकि पुराने डिवाइस आवश्यक रूप से पीआईई का समर्थन नहीं करते हैं। इसलिए, आपको डिवाइस संस्करण के आधार पर, या तो PIE या गैर-PIE का उपयोग करने की आवश्यकता है। यदि आप अपने एंड्रॉइड एप्लिकेशन के भीतर से बाइनरी का उपयोग करना चाहते हैं, तो आपको एपीआई स्तर की जांच करने और सही बाइनरी निकालने की आवश्यकता है।

APP_ABI को केवल उन आर्किटेक्चर के लिए बाइनरी का निर्माण करने के लिए armeabi जैसे विशिष्ट प्लेटफार्मों में बदला जा सकता है।

सबसे खराब स्थिति में, आपके पास प्रत्येक आर्किटेक्चर के लिए एक PIE और एक गैर-PIE बाइनरी दोनों होगा (ndk-r10e का उपयोग करके लगभग 14 अलग-अलग बायनेरी)।

निष्पादन योग्य बनाने के लिए:

cd project
ndk-build

आप बायनेरिज़ को project/libs/<architecture>/hello_world । आप के माध्यम से उन्हें का उपयोग कर सकते ADB ( push और chmod निष्पादन योग्य अनुमति के साथ है) या आपके आवेदन से (निकालने और chmod निष्पादन योग्य अनुमति के साथ यह)।

सीपीयू की वास्तुकला का निर्धारण करने के लिए, प्राथमिक आर्किटेक्चर के लिए बिल्ड प्रॉपर्टी ro.product.cpu.abi को पुनः प्राप्त करें या समर्थित आर्किटेक्चर की पूरी सूची के लिए ro.product.cpu.abilist (नए उपकरणों पर)। आप अपने आवेदन के भीतर या ADB के माध्यम से getprop <name> का उपयोग करके android.os.Build वर्ग का उपयोग करके ऐसा कर सकते हैं।

बिल्ड की सफाई कैसे करें

यदि आपको बिल्ड साफ करने की आवश्यकता है:

ndk-build clean

Android.mk के अलावा मेकफाइल का उपयोग कैसे करें

ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk

Ndk में लॉग इन कैसे करें

पहले सुनिश्चित करें कि आप अपने Android.mk फ़ाइल में लॉगिंग लाइब्रेरी के विरुद्ध लिंक करें:

LOCAL_LDLIBS := -llog   

फिर निम्न __android_log_print() कॉल में से एक का उपयोग करें:

#include <android/log.h>    
#define TAG "MY LOG"

__android_log_print(ANDROID_LOG_VERBOSE,    TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_WARN,       TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_DEBUG,      TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_INFO,       TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_ERROR,      TAG, "The value of 1 + 1 is %d", 1 + 1)

या संबंधित मैक्रोज़ को परिभाषित करके अधिक सुविधाजनक तरीके से उपयोग करें:

#define  LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,    TAG, __VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,       TAG, __VA_ARGS__)
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,      TAG, __VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,       TAG, __VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,      TAG, __VA_ARGS__)

उदाहरण :

int x = 42;
LOGD("The value of x is %d", x);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow