2017-05-18 23 views
2

지금 며칠 동안 고민하고 있습니다.안드로이드 스튜디오 C 파일 내에서 공유 라이브러리 (.so) 메소드를 호출하십시오.

대상 가져 오기 : 지금이 순간 난 그냥 (쉽게 완벽한 일)을 NDK의 helloJNI 샘플 코드를 포함하는 간단한 C++ 프로젝트 (1 개 .H & 1 .cpp 파일) 및 최소한의 응용 프로그램으로 테스트하고 있습니다 안드로이드 스튜디오에 기존의 C/C++ 파일 (프로젝트)

접근 다른 가능성의 (수십)의 일부를 밖으로 시도 후, 나는/다음 단계는 내 삶의 목적에 가장 적합한 솔루션이 될 것이라고 생각 생각 :

  1. Visual Studio 2015 "Android 용 공유 라이브러리 생성"(또는 뭔가)에서 공유 라이브러리 (Calculator.so) 만들기 [성공]
  2. src/main /에 하위 폴더가있는 jniLibs 폴더를 만듭니다 (x86은 my case)
  3. src/main/jniLibs에 Android.mk 파일을 추가하십시오. (?)
  4. Include 문 : "lib"및 ".so"가없는 System.loadLibrary ("Calculator")에서 MainActivity

라이브러리는 Android.mk와 마찬가지로 jniLibs 폴더에 Android Studio에 나열됩니다. 더욱이 apk를 빌드하면 라이브러리가 성공적으로 압축되고 unzipping으로 오류가 발생하지 않습니다. BUT : 어떻게 라이브러리의 메소드를 호출 할 수 있습니까? 다른 스레드에서 제공되는 다른 솔루션을 시도했지만 위의 설명 된 내 .mk 또는 내 단계에서 뭔가 놓친 것 같아요.

의 같은 네이티브 lib.cpp에서

  • 다른 #include <myLib> 문을 시도
  • 다른 Android.mk 설정 (그러나조차하지 자습서 나에게 많은 도움이 그래서 파일을 만들기 위해 새로운 해요 내 특정 문제 : 하위 폴더 86
  • 및 많은 다른 사람과 같은 libCalculator.so에 대한 :))
  • 다른 위치 - 단순히 기압 (wasntme)를 생각 나게하지

귀하의 도움에 감사드립니다!

Android.mk는

LOCAL_PATH := $(call my-dir) 
APP_ABI := x86   

# library info  
include $(CLEAR_VARS) 
LOCAL_MODULE := Calculator 
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/Calculator.so 
LOCAL_EXPORT_C_INCLUDES := ..../Visual Studio 2015/Projects/SO_Library/SO_Library 
include $(BUILD_SHARED_LIBRARY) 

답변

0

는 많은 것들을, 당신은 안드로이드 NDK에서 할 수있다. 예를 들어, 카메라 하드웨어는 안드로이드 OS에서 가장 무거운 하드웨어 중 하나입니다. 얼굴, 사물을 감지하고 효과를주는 기능과 수천 가지 기능을 제공하는 NDK가 가장 좋습니다. 일부는 단계를하는 데 도움이 :

  1. 당신은 구축 할 수 있습니다 미리 작성된 공유 (.so를) 또한 안드로이드 스튜디오에서 정적 (.A) 라이브러리. Visual Studio가 필요하지 않습니다.
  2. 메인 폴더에 jniLibs 폴더를 생성하지 마십시오. gradle을 통해 프로젝트를 빌드하면 이미이 폴더를 만들고 대상 라이브러리를 넣습니다. 라이브러리를 미리 빌드하려면 main/jni/libs 폴더에이 라이브러리를 넣고 Android.mk로 미리 작성하십시오.
  3. jnilibs 폴더에 Android.mk 파일을 추가하지 마십시오. main/jni 폴더에이 파일을 만듭니다. 또한 Application.mk 파일.
  4. 필요한 모든 활동에서 정적 방법으로 라이브러리를 호출하십시오. 이와 같이 :

    static { System.loadLibrary("my_library") } 
    

    "lib"및 ".so"확장자가 없습니다.

네이티브 메소드를 호출하려면 "기본"키워드 만 사용하십시오. 예 :

private native int nGetNumberFromNativeSide(); 

원하는대로이 메서드를 호출하고 결과를 얻습니다. 하지만 NDL을 건물에 설치하려면이 answer을보십시오.

include $(CLEAR_VARS) 
ifneq (,$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86 arm64-v8a x86_64)) 

LOCAL_MODULE := my_library 
LOCAL_SRC_FILES := $(LOCAL_SRC_LOCATION)/native1.cpp native2.cpp 
include $(BUILD_SHARED_LIBRARY) 
  • 당신은 당신이 원하는 이름 무엇이든 넣을 수 있지만, LIB 및 .so를 확장을 추가 해달라고 : Android.mk에서 라이브러리를 구축하기위한, 이러한 샘플 라인은 아마도 당신을 도와줍니다. Ndk는 이미 그것을하고있다.
  • Android.mk 예제를 이미 보냈습니다.
  • Android.mk 파일을 빌드하면 라이브러리의 적절한 폴더를 찾습니다. main/libs/x86/libmy_library.so와 같습니다.

나는이 대답이 도움이 될 것으로 생각합니다. 더 많은 질문이 있거나 의견에 추가하면 답변을 편집하고 답변을 추가하겠습니다.

+0

Android Studio에서 컴파일 할 라이브러리가 있습니다. .mk 파일에 대한 큰 도움을 주셔서 대단히 감사합니다. 검색에서 많이 오해 한 것입니다. 이제 질문이 하나 더 생겼습니다. 그 결과를 얻지 못했기 때문에 어떻게 실행시킬 수 있습니까? (.jni 구문으로 묶이지 않은) 메소드는 샘플 native-lib.cpp를 말할 수 있습니까? –

+0

당신을 환영합니다!). .SO는 메소드가 아니며 공유 라이브러리입니다. C++ 소스 및 일부 정적 라이브러리에서 빌드됩니다. .SO 라이브러리에있는 메소드를 사용하려면 "native"키워드로 호출 할 수 있습니다. 나는 이미 그것을 설명했다. – JavadKhan