2014-08-27 2 views
1

센서 (대부분 가속도계 및 자이로) 데이터를 캡처하고 해당 데이터에서 일부 기능 감지 알고리즘을 작성하기 위해 작성한 JNI 라이브러리가 있습니다. 감지 된 기능은 몇 가지 구성 파일을 통해 구성 할 수 있습니다. 기능이 검출되면 (자), JNI는 콜백을 사용해 어플리케이션의 java 측에 통지합니다. 이 모든 것이 훌륭하게 작동합니다.Java에서 JNI 라이브러리의 여러 복사본 인스턴스화

이제 동일한 JNI 라이브러리의 인스턴스를 동시에 실행하여 여러 구성 파일의 기능을 동시에 인식 할 수 있기를 원합니다. 이를 위해 JNI 라이브러리에 대한 콜백을 구현하는 '래퍼 (wrapper)'클래스를 작성했으며 라이브러리의 모든 초기화도 담당합니다. 나는이 클래스를 단순히 인스턴스화하고 각 인스턴스를 따로 따로 사용할 계획이었습니다. 내가 발견 한 것은 각 래퍼 인스턴스가 구별되는 동안 라이브러리는 정적으로 선언 된 것처럼 인스턴스간에 재사용된다는 것입니다. Wrapper 클래스의 두 번째 인스턴스에서 라이브러리를 초기화하려고하면 이미 초기화 된 것입니다.

여기에 내가 작성한 코드와 유사 래퍼 클래스는 다음과 같습니다

public class JNIWrapper { 

    public native int initializeJNI(String configPath); 
    public native void endProcessing(); 
    public native int getInstanceIdFromJNI(); 

    public JNIWrapper(){ 
     try { 
      System.loadLibrary("libjnicode.so"); 
     } 
     catch (Exception e) { 
      Log.e("JNI", "WARNING: Could not load libjnicode.so: " + e.getMessage()); 
     } 
    } 

    public int initialize(String configPath){ 
     return initializeJNI(configPath); 
    } 
    public void stop(){ 
     endProcessing(); 
    } 
    public void callbackFromJNI(int output, int instanceId){ 
     //notify the subscribed application(s) of the feature detection 
     //via message passing. 
    } 
} 

사람이 내가 JNI 라이브러리의 여러 복사본을 인스턴스화 할 수있는 방법을 알고 있나요?
감사합니다.

답변

4

당신은 그렇게 할 수 없습니다. 동적 링커는 지정된 .so 파일을 프로세스로 한 번만로드합니다.

가벼운 객체 지향 스타일을 제공하도록 라이브러리를 수정하면 구성 파일이나 호출에서 인스턴스를 만들고 프로세스 수준의 정적 상태가 아닌 인스턴스를 초기화 할 수 있습니다. 반드시 복잡하지는 않습니다. 기본적으로 모든 상태를 구조체에 넣고 모든 호출을 통해 포인터를 전달합니다. 피곤한 "붙여 넣기"손가락을내는 마라톤 편집자 세션을 한 번 거친 다음 실수를 정리합니다. 다행스럽게도 일단 정적 변수를 제거하면 남은 모든 시도에서 컴파일 오류가 발생합니다.

매우 해킹 된 대안은 AndroidManifest.xml에서 일부 원격 프로세스 서비스를 선언하고 각 프로세스에 라이브러리를로드하는 것일 수 있습니다. 또는 안드로이드 모델을 실제로 깨고 (그리고 이론적으로 무작위로 죽일 위험성이 있음) 라이브러리를 다중 주문형 기본 실행 파일에로드하십시오.

+1

그리고 이것은 Java가 아닌 운영 체제의 특성입니다. – EJP

+0

감사합니다. 나는 그것이 두려웠다. 또한 새 랩퍼를 인스턴스화 할 때마다 .so 파일을 10 개 생성하고 새 파일을 사용할 수 있다고 생각했습니다. 그게 효과가 있다면 어떨까요? –

+1

내 보낸 함수 및 변수 이름을 일부 대량 이름 변경 작업 (objcopy?)을 통해 고유하게 만들 수 있다면 ...하지만 apk도 크게 만들 수 있습니다. –