2015-06-05 15 views
5

Sono nuovo di Android. Ho un ciao-mondo funzione di codice nativo di base come questo:Utilizzo di file .so in Studio Android

#include <string.h> 
    #include <jni.h> 
    #include <cassert> 
    #include <string> 
    #include <iostream> 
    #include <fromhere.h> 
    using namespace std; 

    /* This is a trivial JNI example. 
    * The string returned can be used by java code*/ 
    extern "C"{ 
    JNIEXPORT jstring JNICALL 
     Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) 
    { 
    #if defined(__arm__) 
     #if defined(__ARM_ARCH_7A__) 
     #if defined(__ARM_NEON__) 
      #if defined(__ARM_PCS_VFP) 
      #define ABI "armeabi-v7a/NEON (hard-float)" 
      #else 
      #define ABI "armeabi-v7a/NEON" 
      #endif 
     #else 
      #if defined(__ARM_PCS_VFP) 
      #define ABI "armeabi-v7a (hard-float)" 
      #else 
      #define ABI "armeabi-v7a" 
      #endif 
     #endif 
     #else 
     #define ABI "armeabi" 
     #endif 
    #elif defined(__i386__) 
     #define ABI "x86" 
    #elif defined(__x86_64__) 
     #define ABI "x86_64" 
    #elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ 
     #define ABI "mips64" 
    #elif defined(__mips__) 
     #define ABI "mips" 
    #elif defined(__aarch64__) 
     #define ABI "arm64-v8a" 
    #else 
     #define ABI "unknown" 
    #endif 
     string s = returnit(); 
     jstring retval = env->NewStringUTF(s.c_str()); 
     return retval; 
    } 
    } 

Ora, se scrivo fromhere.cpp come segue:

#include <string> 
using namespace std; 
string returnit() 
{ 
    string s="Hello World"; 
    return s; 
} 

posso includere fromhere.h scrivendo un file fromhere.h e dichiarando returnit in questo e includendo semplicemente il nome del file sopra in LOCAL_SRC_FILES di Android.mk e "Hello World" appare nella vista testuale che ho creato dalla classe java.

Ma voglio compilare questi da there.cpp e fromhere.h come file .so predefinito costruito ny ndk e utilizzare la funzione returnit() da esso. Qualcuno mi può spiegare passo dopo passo come farlo in Android Studio per essere specifico?

Per favore correggimi se ho detto una sciocchezza.

risposta

1

Hai detto che stavi utilizzando Android Studio, ma per impostazione predefinita Android Studio ignora i tuoi Makefile e ne usa i propri generati automaticamente, senza supporto per le distribuzioni native (per ora).

Se Disattiva il supporto built-in e fare chiamate a NDK-costruire da soli, mettendo qualcosa di simile all'interno del vostro build.gradle:

android { 
    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs 
     jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk 
    } 
} 

Ecco la soluzione, utilizzando Makefiles:

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_SRC_FILES := fromhere.cpp 
LOCAL_MODULE := fromhere 
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) # useless here, but if you change the location of the .h for your lib, you'll have to set its absolute path here. 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_SRC_FILES := hello-world.cpp 
LOCAL_MODULE := hello-world 
LOCAL_SHARED_LIBRARIES := fromhere 
include $(BUILD_SHARED_LIBRARY) 
Problemi correlati