2014-03-24 2 views
1

Похоже, это популярная проблема,UnsatisfiedLinkError при вызове метода C++ в файле C++ из Java файла

И я до сих пор не найти решение.

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 Follow @dextor ответ. Извините, потому что я ошибаюсь. Единственное, что мне нужно для этого вопроса, - это изменение от public native int getString() до public native String getString().

Это работает сейчас.

+0

Опубликовать достаточно трассировки стека, чтобы включить сообщения, созданные при попытке загрузить библиотеку, и ** полную ** неудовлетворенную ошибку ссылки. Также укажите имя файла Java, в котором определяется собственный метод. –

+0

И не забудьте включить e.printStackTrace() в свои блоки catch, чтобы вы получали значимые отчеты об ошибках. –

+0

try-catch 'System.loadLibrary (" ffmpeg ");' не запускается. Все нормально. –

ответ

2

Не уверен (на самом деле не пытался), но единственная неправильная вещь, которую я заметил, - это возвращаемый тип объявлений вашего метода.

Java стороне

public native int getString()

NDK стороне

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

В Java, у вас есть int. На стороне C у вас есть jstring.

+1

Да, это определенно вызовет проблемы до того, как код будет работать, хотя это может и не вызвать проблему, которая была отправлена. –

+0

Да, оба они правы. Благодарю. –

Смежные вопросы