我创建了一个简单的应用程序来帮助我学习ndk,jni,并让我的c ++技能恢复到标准。但是当我从cygwin命令行对我的项目运行ndk-build时,我遇到了一些编译错误。我已经有一段时间了,因为我已经在任何程度上使用了c ++,所以我知道我的语法可能有点偏离,所以如果有人可以帮我清理它或解释我怎么能这样做那么那就太棒了.....所以继承人我的c ++代码:
编辑:最新代码
#include <iostream>
#include <Eigen/Dense>
#include <math.h>
#include <jni.h>
using namespace Eigen;
Vector3f vec;
Vector3f vec2;
Vector3f vecRtrn;
void vecLoad(float x, float y, float z, float x2, float y2, float z2){
vec(0) = x;
vec(1) = y;
vec(2) = z;
vec2(0) = x2;
vec2(1) = y2;
vec2(2) = z2;
}
void vecAdd(Vector3f vecA, Vector3f vecB){
vecRtrn = vecA+vecB;
}
extern "C"
{
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2){
float array1[3];
jfloatArray flt1 = fltarray1;
jfloatArray flt2 = fltarray2;
//flt1 = env->GetFloatArrayElements( fltarray1,0);
//flt2 = env->GetFloatArrayElements( fltarray2,0);
vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]);
vecAdd(vec, vec2);
array1[0] = vecRtrn[0];
array1[1] = vecRtrn[1];
array1[2] = vecRtrn[2];
return array1;
};
}
现在我很确定我没有使用正确的方法通过jni将数组返回到java,但这是一个单独的问题......但请随意评论一下;)
下面是我最近几次构建错误的更新列表.....它肯定比原始列表短很多:)
$ /cygdrive/c/android-ndk-r7/ndk-build
Compile++ thumb : test <= test.cpp
jni/test.cpp: In function '_jfloatArray* Java_jnimath_act_JnimathActivity_test(JNIEnv*, _jobject*, _jfloatArray*, _jfloatArray*)':
jni/test.cpp:42: error: cannot convert '_jfloatArray' to 'float' for argument '1' to 'void vecLoad(float, float, float, float, float, float)'
jni/test.cpp:49: error: cannot convert 'float*' to '_jfloatArray*' in return
make: *** [obj/local/armeabi/objs/test/test.o] Error 1
编辑:继承我的java代码......
package jnimath.act;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class JnimathActivity extends Activity {
/** Called when the activity is first created. */
public EditText x;
public EditText y;
public EditText z;
public EditText x2;
public EditText y2;
public EditText z2;
public float[] vecArray;
public TextView textView1;
public Button run;
float[] array3 = new float[3];
float[] array1 = new float[3];
float[] array2 = new float[3];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
x = (EditText)findViewById(R.id.x);
y = (EditText)findViewById(R.id.y);
z = (EditText)findViewById(R.id.z);
x2 = (EditText)findViewById(R.id.x);
y2 = (EditText)findViewById(R.id.y);
z2 = (EditText)findViewById(R.id.z);
textView1 = (TextView)findViewById(R.id.textView1);
run = (Button)findViewById(R.id.run);
run.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
array1[0] = Float.parseFloat(x.getText().toString());
array1[1] = Float.parseFloat(y.getText().toString());
array1[2] = Float.parseFloat(z.getText().toString());
array2[0] = Float.parseFloat(x2.getText().toString());
array2[1] = Float.parseFloat(y2.getText().toString());
array2[2] = Float.parseFloat(z2.getText().toString());
array3 = test(array1, array2);
String text = array3[0]+" "+array3[1]+" "+array3[2];
textView1.setText(text);
}
});
}
public native float[] test(float[] array1, float[] array2);
static {
System.loadLibrary("test");
}
}
答案 0 :(得分:1)
正如错误所述,编译器不喜欢你在vecLoad中拥有的内容。你确定Vector3f有正确的'('运算符吗?我先检查一下。
答案 1 :(得分:1)
第一个错误是由于net指定了float array1[];
的大小,与java不同,这是不允许的。另一方面,您可以将数组指定为float *array1;
而不进行初始化。
第二个和第三个错误是指在使用->
运算符之前取消引用指针。正确的方法是:
flt1 = env->GetFloatArrayElements(env, fltarray1, NULL);
flt2 = env->GetFloatArrayElements(env, fltarray2, NULL);
您遗漏的最后一个错误数字应该是flt2[2]
而不是flt[2]
。