센서 (대부분 가속도계 및 자이로) 데이터를 캡처하고 해당 데이터에서 일부 기능 감지 알고리즘을 작성하기 위해 작성한 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 라이브러리의 여러 복사본을 인스턴스화 할 수있는 방법을 알고 있나요?
감사합니다.
그리고 이것은 Java가 아닌 운영 체제의 특성입니다. – EJP
감사합니다. 나는 그것이 두려웠다. 또한 새 랩퍼를 인스턴스화 할 때마다 .so 파일을 10 개 생성하고 새 파일을 사용할 수 있다고 생각했습니다. 그게 효과가 있다면 어떨까요? –
내 보낸 함수 및 변수 이름을 일부 대량 이름 변경 작업 (objcopy?)을 통해 고유하게 만들 수 있다면 ...하지만 apk도 크게 만들 수 있습니다. –