1

我有以下内容:

jni接口.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);
};

jni接口.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);
}
4

1 回答 1

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);
};

Whenever you see an error like this, the first thing you should do is carefully go over the method signatures - name, package, parameter and return type. Any small mistake leads to this general error!

于 2013-08-21T17:24:06.787 回答