2015-12-04 2 views
0

Я разработал много приложений с C++, JNI, NDK, но это первый раз, когда это происходит со мной.UnsatisfiedLinkError в Java, исходя из JNI

Это мой Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

OPENCV_LIB_TYPE:=SHARED 
OPENCV_CAMERA_MODULES:=off 
OPENCV_INSTALL_MODULES:=on 

include /Users/rafaelruizmunoz/Desktop/Android_Tools/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk 

include $(OPENCV_PATH) 
LOCAL_MODULE := libParameters 
LOCAL_C_INCLUDES += $(LOCAL_PATH) 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/atmosphereFunctions/curl 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/atmosphereFunctions/Solarlib 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/coreFunctions 

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true 
LOCAL_MODULE := libParameters 
LOCAL_MODULE_NAME := Parameters 
LOCAL_SRC_FILES := androidClass.cpp coreFunctions/parameters.cpp atmosphereFunctions/atmosphere.cpp atmosphereFunctions/Solarlib/Solarlib.cpp 
LOCAL_LDLIBS  += -llog -ldl 
LOCAL_CPPFLAGS := -std=c++11 
LOCAL_CFLAGS := -std=c++11 -w 

CFLAGS=-w -g -Wall -Wextra -std=c++11 -Wno-write-strings ../../include/boost 

LOCAL_SHARED_LIBRARIES := libopencv_java 
LOCAL_STATIC_LIBRARIES := libcurl 

include $(BUILD_SHARED_LIBRARY) 

Мой Application.mk:

APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions 
APP_ABI := armeabi armeabi-v7a mips x86 

APP_CPPFLAGS += -std=gnu++0x 
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions 
APP_CPPFLAGS += -DDEBUG 
APP_CPPFLAGS += -std=c++11 
APP_CPPFLAGS += -Wno-error=format-security 

APP_CFLAGS := -std=c++11 
NDK_TOOLCHAIN_VERSION := 4.8 
LOCAL_C_INCLUDES += ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include 

APP_USE_CPP0X := true 

Мой androidClass.h

#include <jni.h> 

#include "Parameters.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

    JNIEXPORT jstring JNICALL Java_com_example_Parameters_getParameters(JNIEnv * env, jclass, jint GMT, jfloat lat, jfloat lon, jfloat par, jstring fpath); 

#ifdef __cplusplus 
} 
#endif 

и это функция внутри androidClass.cpp:

JNIEXPORT jstring JNICALL Java_com_example_Parameters_getParameters(JNIEnv * env, jclass, jint GMT, jfloat lat, jfloat lon, jfloat par, jstring fpath) { 

     return (jstring)"hey!"; 

} 

то в моем классе Parameters.java (находится в com.example.Parameters) я установил:

public static native String getParameters(int GMT, float lat, float lon, float par, String fpath); 

и когда я называю его (Я звоню из другого пакета, так как это public static):

java.lang.UnsatisfiedLinkError: Native method not found: com.example.Parameters.getParameters:(IFFFLjava/lang/String;)Ljava/lang/String;

Что я здесь делаю неправильно?

спасибо, что заранее.

+2

BTW - даже если вы исправите это, это, скорее всего, произойдет сбой - строка C не является jstring и не может быть возвращена как одна. С одной стороны, память не находится в куче Java. Для другого, jstring - это класс строки java. –

+0

Первой проверкой должно быть то, установлена ​​ли библиотека на устройстве; если нет - упакован ли он в APK. –

+0

@AlexCohn действительно, есть только один .so, который содержит эту библиотеку, и находится внутри APK –

ответ

0

Это была моя вина.

Я всегда кодируются C++ библиотеки только для 1 активности (тесты, возможные библиотеки), и я думал, что это проживал статически в памяти, но я должен был назвать сноваSystem.loadLibrary("..."), который я не сделал.

+1

. Библиотека имеет «статическую» память; привязка классов Java не является. –

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