Java 中的 UnsatisfiedLinkError,来自 JNI
UnsatisfiedLinkError in Java, coming from JNI
我用 C++、JNI、NDK 开发过很多应用程序,但这对我来说还是第一次。
这是我的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!";
}
然后在我的classParameters.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;
我做错了什么?
非常感谢您。
真是我的错
我一直只为 1 个 activity(测试、最终库)编写 C++ 库,我认为它静态驻留在内存中,但我不得不再次调用 System.loadLibrary("...")
我没有。
我用 C++、JNI、NDK 开发过很多应用程序,但这对我来说还是第一次。
这是我的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!";
}
然后在我的classParameters.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;
我做错了什么?
非常感谢您。
真是我的错
我一直只为 1 个 activity(测试、最终库)编写 C++ 库,我认为它静态驻留在内存中,但我不得不再次调用 System.loadLibrary("...")
我没有。