2017-10-24 5 views
3

온라인에서 특정 질문에 답변 할 수있는 사람을 찾지 못했습니다. 나는 일부 .so 라이브러리를 복사하여 새로운 프로젝트에 붙여 넣으려는 오래된 Android 프로젝트를 가지고있다. 필자는이 새로운 것을 처음 접했고이 라이브러리를 어디에서 찾을 지 알려줄 필요가 있다는 것을 알았지 만 컴파일 된 코드를 가져 오기 위해 CMake 나 NDK를 사용해야할지 모르겠습니다.기존의 jni 라이브러리 (이미 ".so"로 컴파일 됨)를 다른 Android 프로젝트에 추가하십시오.

static { 
     System.loadLibrary("serial_port"); 
    } 

을하지만 어떻게 내가 곳이 복사 및 붙여 넣기 파일을 찾을 수있는 컴파일러를 말할까요 :이처럼 내 프로그램이 라이브러리를 요구

enter image description here

:이처럼 내 디렉토리 모습입니다 ?

Android에서 documentation을 기반으로 파일을 시작했지만 몇 가지 사항에 대해 혼란스러워합니다. 이것은 내가 지금까지 가지고있는 것이다 :

# Sets the minimum version of CMake required to build your native library. 
# This ensures that a certain set of CMake features is available to 
# your build. 

cmake_minimum_required(VERSION 3.4.1) 

# Specifies a library name, specifies whether the library is STATIC or 
# SHARED, and provides relative paths to the source code. You can 
# define multiple libraries by adding multiple add.library() commands, 
# and CMake builds them for you. When you build your app, Gradle 
# automatically packages shared libraries with your APK. 

add_library(# Specifies the name of the library. 
      serial_port 

      # Sets the library as a shared library. 
      SHARED 

      IMPORTED 

      serial_port/src/${ANDROID_ABI}/libserial_port.so 

      # Provides a relative path to your source file(s). 
      src/main/cpp/libs/armeabi/libserial_port.so) 

나는 그것을 올바르게하고 있다고 생각하지 않는다. 제발 나를보고 올바른 방향으로 가리 킵니다. 감사합니다

답변

1

jniLibs 각각의 폴더에 보관해야합니다.

예 :

/app/src/main/jniLibs/armeabi/libserial_port.so

그리고 당신이 그들을 사용하는 CMake 같은 다른 도구를 사용할 필요가 없습니다. 직접로드 할 수 있습니다.

+0

하위 디렉토리 (x86, armeabi)에서도 작동합니까? 전에 시도했지만 안드로이드 스튜디오 내가 내 라이브러리를로드 할 때 호출했던 열린 메서드를 인식하지 못했습니다. System.loadLibrary ("serial_port")를 호출하면이 라이브러리를 인식하지 못하는 것 같습니다. 추신 : 나는이 도서관을 쓰지 않았다. 제조업체가 보낸 샘플 프로그램에서 가져옵니다. 직렬 포트에 액세스하여 POS 시스템의 내부 프린터에 액세스하려고합니다. 샘플 프로그램에서는 private static native FileDescriptor open (String path, int baudrate, int flags, boolean flowCon)을 호출합니다. –

+0

Android 스튜디오가 인식하지 못합니다. 그러나 해당 파일을 해당 디렉토리에 배치하면 실행됩니다. –

+0

한편, 정적 네이티브 메소드는 원하는 곳에 배치 할 수 없습니다. 나는 당신이 적당한 포장에있는 적당한 종류에서 그 (것)들을 선언하고 있다는 것을 희망한다. 샘플 프로그램에서 샘플을 정확하게 배치하십시오. –

0

Android Studio의 기본 JNI forlder는 입니다. jniLibs입니다. 네이티브 라이브러리를이 폴더 안에 넣으면 앱 빌드 경로에 자동으로 추가됩니다.

귀하의 경우 기본 코드를 libs 폴더에 넣었습니다. 작동 시키려면 app/build.gradle 파일에 새로운 JNI 경로를 지정해야합니다. 다음과 같은 그라데이션 스크립트를 사용할 수 있습니다 : ---

android{ 

    sourceSets { 
     main { 
      jniLibs.srcDirs = ['libs'] 
     } 
    }  

} 
+0

파일로드는 어떻게됩니까? 이 같은로드 : System.loadLibrary ("serial_port"); 안드로이드는 "serial_port"라고 부를 때 내가 의미하는 바를 어떻게 알 수 있습니까? –

+0

System.loadLibrary ("Abc")를 호출하면 안드로이드 시스템은 적절한 아키텍처 하위 폴더에서 libAbc.so 파일을로드합니다. 따라서 기본 app jni 디렉토리 ("app/src/main/jniLibs")에 (armeabi, armeabi-v7, x86) 폴더를두면 System.loadLibrary ("serial_port")를 호출하면됩니다. 효과가있을 것입니다. 그라디언트에서 jni 경로를 변경할 필요가 없습니다. – srs