【问题标题】:UnsatisfiedLinkError when calling C++ method in C++ file from Java file从 Java 文件调用 C++ 文件中的 C++ 方法时出现 UnsatisfiedLinkError
【发布时间】:2014-05-01 16:05:22
【问题描述】:

看起来这是一个流行的问题,

我还是没有找到解决办法。

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

知道如何解决这个问题的人,

请告诉我,

谢谢

更新 关注@dextor 的回答。对不起,因为我弄错了。对于这个问题,我唯一需要的就是从 public native int getString() 更改为 public native String getString()

现在可以了。

【问题讨论】:

  • 发布足够的堆栈跟踪信息,以包含您尝试加载库时生成的消息,以及 full 未满足的链接错误。还要提供定义本机方法的 Java 文件的名称。
  • 并确保在您的 catch 块中包含 e.printStackTrace() 以便您获得有意义的错误报告。
  • 尝试捕获System.loadLibrary("ffmpeg"); 未运行。没关系。

标签: android c++ android-ndk unsatisfiedlinkerror android.mk


【解决方案1】:

不确定(实际上没有尝试过),但我注意到的唯一错误是您的方法声明的返回类型。

Java 端

public native int getString()

NDK 端

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

在 Java 中,您有一个 int。在 C 端,您有一个 jstring

【讨论】:

  • 是的,这肯定会在代码工作之前引起问题,尽管它可能不会导致发布的问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-24
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多