Android - ошибки компиляции C ++ в cygwin / android-ndk - PullRequest
0 голосов
/ 17 декабря 2011

Я создал простое приложение, чтобы помочь мне выучить ndk, jni и вернуть свои навыки c ++ в нормальное русло. Однако я застрял, потому что получаю некоторые ошибки компиляции, когда запускаю ndk-build для моего проекта из командной строки cygwin. Прошло много времени с тех пор, как я в какой-то степени использовал 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;

};
}

Теперь я уверен, что не использую правильный способ вернуть массив обратно в java через jni, но это отдельная проблема ...... но, пожалуйста, не стесняйтесь комментировать это;)

Вот обновленный список последних двух ошибок сборки, которые у меня есть ..... он определенно намного короче исходного списка :)

$ /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");
  }
}

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Первая ошибка связана с тем, что net указывает размер для float array1[]; В отличие от java, это не разрешено. С другой стороны, вы можете указать массив как float *array1; без его инициализации.

Вторая и третья ошибка относятся к разыменованию указателя перед использованием оператора ->. Правильный способ сделать это будет:

flt1 = env->GetFloatArrayElements(env, fltarray1, NULL);
flt2 = env->GetFloatArrayElements(env, fltarray2, NULL);

Последняя ошибка, в которой вы просто пропустили число, похоже, это должно быть flt2[2] вместо flt[2].

1 голос
/ 17 декабря 2011

Как говорится в сообщении об ошибке, компилятору не нравится то, что есть в vecLoad.Вы уверены, что в Vector3f указан правильный оператор '('? Сначала я проверю это.

...