2014-03-24 6 views
1

인기있는 문제인 것 같습니다.Java 파일에서 C++ 파일의 C++ 메소드를 호출 할 때 UnsatisfiedLinkError가 발생합니다.

그리고 여전히 해결책을 찾지 못했습니다.

package name : app.cloudstringers

Java file : Completed.java

static { 
    try { 
     System.loadLibrary("ffmpeg"); 
    } catch (UnsatisfiedLinkError e) { 
     Log.d("", "Error : " + e.toString()); 
    } 

} 

    // Define native method 
public native int getString(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.page_completed); 

    // Call native method 
    Log.d("", "" + getString()); 

C++ file : ffmpeg.cpp

#include <jni.h> 
#include <android/log.h> 
#include <string.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

JNIEXPORT jstring JNICALL Java_app_cloudstringers_Completed_getString(JNIEnv* env, jobject thiz) 
{ 
jstring strRet = env->NewStringUTF("HelloWorld from JNI !"); 
return strRet; 
} 

#ifdef __cplusplus 
} 
#endif 

Android.mk file

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := ffmpeg 
LOCAL_SRC_FILES := ffmpeg.cpp 
include $(BUILD_SHARED_LIBRARY) 

나는 응용 프로그램을 실행하지만, 여전히 오류 예외에게이 문제를 해결하는 방법,

내게 알려주십시오 알고 UnsatisfiedLinkError : getString

사람,

감사

UPDATE 따르 @dextor를 얻을 수 대답. 죄송합니다. 실수를해서. 이 질문에 필요한 것은 public native int getString()에서 public native String getString()으로 바뀝니다.

이제 작동합니다.

+0

라이브러리로드 시도로 생성 된 메시지와 ** 전체 ** 만족하지 않은 링크 오류를 포함하도록 스택 추적을 게시하십시오. 또한 원시 메소드가 정의 된 Java 파일의 이름을 제공하십시오. –

+0

그리고 의미있는 오류 보고서를 얻을 수 있도록 catch 블록에 e.printStackTrace()를 포함시켜야합니다. –

+0

'System.loadLibrary ("ffmpeg");의 try-catch는 실행되지 않습니다. 괜찮아. –

답변

2

잘 모르지만 (실제로 시도하지는 않았지만) 내가 알아 차린 유일한 잘못된 것은 메서드 선언의 반환 형식입니다.

public native int getString()

자바에서 NDK 측

JNIEXPORT jstring JNICALL Java_app_cloudstringers_Completed_getString(JNIEnv* env, jobject thiz)

자바 측, 당신은 int 있습니다. C면에는 jstring이 있습니다.

+1

예, 코드가 작동하기 전에 확실히 문제가 발생하지만 게시 된 문제는 발생하지 않을 수 있습니다. –

+0

네, 두 사람이 옳습니다. 감사. –