java.lang.UnsatisfiedLinkError:找不到本机方法使用标头时

时间:2013-08-21 15:12:21

标签: android-ndk

我有以下内容:

jniinterface.h

#include <jni.h>
extern "C" {
  JNIEXPORT jdouble JNICALL Java_com_gleason_finance_JniLib_init(JNIEnv * env, jobject obj, jdouble SO, jdouble U, jdouble D, jdouble R);
};

jniinterface.cpp

#include "jniinterface.h"
JNIEXPORT jdouble JNICALL Java_com_gleason_finance_JniLib_init(JNIEnv * env, jobject obj, jdouble SO, jdouble U, jdouble D, jdouble R, jint N, jdouble K)
{
  return 0.0;
}

但是这会返回以下内容:

E/AndroidRuntime( 3638): java.lang.UnsatisfiedLinkError: Native method not found: com.me.finance.JniLib.init:(DDDDID)D

如果我将jniinterface.cpp更改为:

,它可以正常工作
#include <jni.h>
extern "C" JNIEXPORT jdouble JNICALL Java_com_gleason_finance_JniLib_init(JNIEnv * env, jobject obj, jdouble SO, jdouble U, jdouble D, jdouble R, jint N, jdouble K)
{
  return 0.0;
}

它有效,我是C ++的新手,所以我做错了什么?我应该删除标题吗?为什么它不能与标题一起使用?

不确定为什么这会有所帮助,因为它显然是一个C ++问题(因为C修复)但是在这里:

public class JniLib {
  static {
    System.loadLibrary("fin");
  }
  public static native double init(double SO, double U, double R, double D, int N, double k);
}

1 个答案:

答案 0 :(得分:2)

在jniinterface.h中,函数的返回类型为void。它需要jdouble!您可以将jniinterface.cpp保留为第一个片段中的内容。

编辑:您还缺少头文件中的两个参数。 (名为N和K)

#include <jni.h>
extern "C" {
  JNIEXPORT jdouble JNICALL Java_com_gleason_finance_JniLib_init(JNIEnv * env, jobject obj, jdouble SO, jdouble U, jdouble D, jdouble R, jint N, jdouble K);
};

每当你看到这样的错误时,你要做的第一件事就是仔细检查方法签名 - 名称,包,参数和返回类型。任何小错误都会导致这个一般错误!