2014-07-18 2 views
1

이 내 시나리오 :로드 오류가 기존 공유 라이브러리 (.so를)

-) 나는 NDK 빌드에 의해 생성 libpsp.so라는 공유 라이브러리를 가지고있다. 이 lib는 약 ​​30 개의 .c 파일을 사용하여 생성되었습니다.

Android.mk 사용 :

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

# Here we give our module name and source file(s) 
LOCAL_MODULE := psp 
LOCAL_SRC_FILES := (My .c files) 

include $(BUILD_SHARED_LIBRARY) 

-) NDK 빌드가 자동으로 armeabi/디렉터리/libs가에

을 libpsp.so을 넣어 -) 내 자바 코드에 내가 가진 :

private native int calculateCoefficient(double w, double v_st_e_prev, double c_l); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    **//Loads successfully 
    System.loadLibrary("psp");** 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()).commit(); 
    } 
    TextView lv = (TextView)findViewById(R.id.textView); 

    **//Returns an error: unsatisfiedlinkerror native method not found 
    lv.setText(Integer.toString(calculateCoefficient(1,1,1)));** 
} 

-) 공유 라이브러리를 빌드하는 데 사용되는 .c 파일 중 하나는 서명이있는 calculateCefficient 메소드를 가지고 있습니다.

sint32_t calculateCoefficient(double_t w, double_t v_st_e_prev, double_t *c_l); 

calculateCoefficient 메소드가 .so 라이브러리에있는 경우 Android에서 찾을 수없는 이유는 무엇입니까? 방금 NDK로 일하기 시작 했으니 까 무엇인가를 놓친다면 미안하지만, 조사를 해본 결과 나는 이것에 대한 답을 찾을 수 없습니다.

UPDATE1 : 실제 코드에 액세스 할 수 없으며 라이브러리가 다른 사람에 의해 생성되었습니다. 서명이있는 .h 파일 만 있습니다. 그래서 라이브러리를 만드는 데 사용 된 .c 파일을 편집 할 수 없습니다.

+0

먼저, -d 플래그와 함께 ndk objdump를 사용하여 .so를 분해하고 함수 이름을 grep하여 실제 존재하는 것을 찾습니다. 다음으로 암시 적으로 뿌리 박은 에뮬레이터의 adb 쉘을 사용하거나 장치에서 디버그 빌드가있는 run-as 도구를 사용하여 설치를 검사하고 실제로 압축이 풀린 내용을 확인하십시오. –

답변

1

서명이 잘못되었습니다. JNIEXPORT int JNICALL Java_classname_methodname (JNIENV * env, jobject obj, ...) 여기서 ...은 실제로 전달하려는 매개 변수입니다. 포인터를 전달할 수 없습니다. jdouble 배열을 사용하려는 배열이 필요한 경우 참조로 double을 전달하려는 경우 double을 포함하는 클래스를 전달하고 해당 필드를 객체에 설정해야합니다.

+0

서명은 내가 액세스 할 수있는 헤더 파일에서 가져 왔지만 C 코드도 메소드 서명도 변경할 수 없습니다. – user3486832

+1

죄송합니다, 이전의 의견은 부분적으로 올바르지 않습니다. Java_classname_etc가없는 누락 된 부분이 실제로 문제를 설명합니다. 현재 라이브러리를 고칠 수 없으면 기존 라이브러리를 래핑하고 호출하는 jni 호환 함수로 새 라이브러리를 작성하십시오. 기존 라이브러리를 먼저로드 한 다음 랩퍼를로드하십시오. –

+0

그래서 호출하고 싶은 모든 함수에 대해 JNI 함수를 사용하여 .c 파일을 만들어야합니다. – user3486832

관련 문제