Android 本机调用的结果始终返回1717986916

Android 本机调用的结果始终返回1717986916,android,arrays,android-ndk,Android,Arrays,Android Ndk,我有一个非常简单的Java程序,它接受一个双16数组,并将其传递给本机C调用。在C函数中,我取数组中的每个元素,求和并返回该和。我在网上跟踪了一些示例,遇到了这样的情况:无论数组中的是什么,返回的每个结果都是1717986916。你知道我做错了什么吗?这是我的活动和c代码 public class NDKFooActivity extends Activity implements OnClickListener { // load the library - name matches

我有一个非常简单的Java程序,它接受一个双16数组,并将其传递给本机C调用。在C函数中,我取数组中的每个元素,求和并返回该和。我在网上跟踪了一些示例,遇到了这样的情况:无论数组中的是什么,返回的每个结果都是1717986916。你知道我做错了什么吗?这是我的活动和c代码

public class NDKFooActivity extends Activity implements OnClickListener {
     // load the library - name matches jni/Android.mk
    static {
        System.loadLibrary("ndkfoo");
    }

    // declare the native code function - must match ndkfoo.c
    public static native int sumFIR(double[] arr);

    private TextView textResult;
    private Button buttonGo;
    private double[] dList = new double[16];
    private List<Double> list = new LinkedList<Double>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textResult = (TextView) findViewById(R.id.textResult);
        buttonGo = (Button) findViewById(R.id.buttonGo);
        buttonGo.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        String out = "";

        /////////////////////////////////////
        //load first 16 data sets

        list.add(2135.1); list.add(1130.1); list.add(2530.1); list.add(2430.1);
        list.add(2330.1); list.add(1940.1); list.add(1210.1); list.add(2100.1);
        list.add(2095.1); list.add(2105.1); list.add(2000.1); list.add(1876.1);
        list.add(1852.1); list.add(1776.1); list.add(1726.1); out += "" + add(1716.1);
        /////////////////////////////////////

        out += "\n" + add(2135.1);            out += "\n" + add(1130.1);
        out += "\n" + add(2530.1);            out += "\n" + add(2430.1);
        textResult.setText(out);
    }

    public double add(double object) {
        if (list.size() > 15 ) {
            list.remove(0);
        }
        list.add(object);
        for (int i=0; i< 16; i++) {
            dList[i] = list.get(i).doubleValue();
        }

        double dResult = sumFIR(dList);
        return dResult;
  }
} 
公共类NDKFooActivity扩展活动实现OnClickListener{
//加载库-名称与jni/Android.mk匹配
静止的{
系统加载库(“ndkfoo”);
}
//声明本机代码函数-必须与ndkfoo.c匹配
公共静态本机int sumFIR(双[]arr);
私有文本视图文本结果;
私人按钮按钮;
私有双精度[]数据列表=新双精度[16];
私有列表=新的LinkedList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textResult=(TextView)findViewById(R.id.textResult);
buttonGo=(按钮)findViewById(R.id.buttonGo);
buttonGo.setOnClickListener(此);
}
@凌驾
公共void onClick(视图){
串出“”;
/////////////////////////////////////
//加载前16个数据集
list.add(2135.1);list.add(1130.1);list.add(2530.1);list.add(2430.1);
list.add(2330.1);list.add(1940.1);list.add(1210.1);list.add(2100.1);
list.add(2095.1);list.add(2105.1);list.add(2000.1);list.add(1876.1);
list.add(1852.1);list.add(1776.1);list.add(1726.1);out+=“”+add(1716.1);
/////////////////////////////////////
out+=“\n”+add(2135.1);out+=“\n”+add(1130.1);
输出+=“\n”+添加(2530.1);输出+=“\n”+添加(2430.1);
textResult.setText(输出);
}
公共双加(双对象){
如果(list.size()>15){
列表。删除(0);
}
列表。添加(对象);
对于(int i=0;i<16;i++){
dList[i]=list.get(i).doubleValue();
}
双dResult=sumFIR(数据列表);
返回结果;
}
} 
ndkfoo.c如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <jni.h>

jdouble Java_com_nsf_ndkfoo_NDKFooActivity_sumFIR (JNIEnv* env, jobject obj, jdoubleArray arr) {
    jdouble result = 0;
    // initializations, declarations, etc
    jint i = 0;

    // get a pointer to the array
    jdouble *c_array = (*env)->GetDoubleArrayElements(env, arr, 0);
    jsize len = (*env)->GetArrayLength(env, arr);

    for (i=0; i<16; i++){
        result = result + c_array[i];
    }

    // release the memory so java can have it again
    (*env)->ReleaseDoubleArrayElements(env, arr, c_array, 0);

    // return something, or not.. it's up to you
    return result;
}
#包括
#包括
#包括
jdouble Java_com_nsf_ndkfoo_ndkfoo活动_sumFIR(JNIEnv*env、jobject obj、jdoubleArray arr){
jdouble result=0;
//初始化、声明等
jint i=0;
//获取指向数组的指针
jdouble*c_数组=(*env)->GetDoubleArrayElements(env,arr,0);
jsize len=(*env)->GetArrayLength(env,arr);
对于(i=0;ireleasedoublearray元素(env、arr、c_数组,0);
//还不还,由你决定
返回结果;
}

好的,找到了答案,原来函数的Java本机使用int而不是double。不确定为什么它几乎总是返回相同的数字

// declare the native code function - must match ndkfoo.c
public static native int sumFIR(double[] arr);
应该是

public static native double sumFIR(double[] arr);