我有一个非常简单的Java程序,它接受一个双16数组传递给Native 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;
}
}
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;
}
答案 0 :(得分: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);