2017-02-06 5 views
1

안드로이드 스튜디오에서 ".so"(공유 라이브러리) 안에 "callMethod()"메소드를 사용하는 데 도움이 필요합니다.안드로이드 스튜디오에서 .so 공유 라이브러리 안의 메소드 호출하기

내 안드로이드 스튜디오 버전은 내가 "SRC/메인 /" 가 그럼 난 jniLibs 폴더 안에 세 개의 폴더를 생성에 jniLibs 폴더를 생성 2.1.3

입니다 : (armeabi, armeabi-V7A, 86) 는 그럼 난 퍼트 언급 된 모든 폴더 안에있는 .so 라이브러리. 내가 무엇을해야 모르는 그 후

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

:이 쓴 MainAcrivity 자바 클래스에서

compile fileTree(dir: 'libs', include: ['*.jar','.so']) 

을 : 그 후, 나는 다음과 같이 build.gradle 업데이트?

어떻게해야합니까? callMethod() 메소드를 .so 라이브러리에서 호출하려면 어떻게해야합니까?

나는 많은 것을 수색했으나, 나는 그것을 어떻게하는지 완전한 모범을 보지 못했다.

고맙습니다.

My Update

나는 아래처럼 내 프로젝트의 새로운 클래스와 네이티브 메소드에 추가 한 :

@SuppressWarnings("JniMissingFunction") 
public class Test1Cpp { 
static { 
    System.loadLibrary("Cpp"); 
} 

public native String callMethod(); 
} 

가 그럼 난 .so를 공유 라이브러리 내부의 메소드를 호출 할 수 있습니다, 내가 또 다른 문제에 직면

, 내 .so 라이브러리가 모든 플랫폼 모바일에서 작동하지 않음

오류는 다음과 같습니다.

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.mysecondtestapp-1/lib/arm/libCpp.so" has unexpected e_machine: 3

그럼 내 질문 : 모든 .so 라이브러리를 모든 플랫폼 모바일에서 작동하도록 변환하는 방법은 무엇입니까?

답변

0

라이브러리가로드되는 것으로 가정합니다. 그렇지 않으면 예외가 발생하며이를 언급했을 것입니다. 따라서 라이브러리에서 사용하고자하는 원시 메소드를 선언 한 다음 호출해야합니다. 다음은 간단한 예제입니다. Sample: hello-jni

샘플 소스 코드는 Hello JNI입니다.

+0

답장을 보내 주셔서 감사합니다 yakobom,하지만 귀하의 예제에서 공유 라이브러리를로드하고 사용하는 방법을 보지 못했습니다. 한편, 안드로이드 스튜디오에서 공유 라이브러리를 링크하고 사용하는 방법에 대한 세부 정보가 필요합니다. –

+0

내가 말했듯이, 당신이 로딩 오류를 나타내지 않았기 때문에, 당신은 로딩에 아무런 문제가 없다고 생각했습니다. 어쨌든 - 내가 준 링크는 당신이해야 할 모든 것을 안내하지만, 작업 예제를보고 싶다면 소스 코드를 보아라. (내 대답을 업데이트했다) – yakobom

+0

후속 작업을 위해 @yakobom에게 많은 감사를 보낸다. hello-jni 샘플과 static {System.loadLibrary ("hello-jni"); }하지만 생성 된 공유 라이브러리 (.so)가 보이지 않았습니다. .c 파일을 삭제하면 프로젝트가 실행되지 않고 오류가 발생했습니다. java.lang.UnsatisfiedLinkError : 구현이 없습니다. java.lang.String com.example.hellojni.HelloJni.stringFromJNI는() 그래서, 그것은 아마 .so를 라이브러리 –