【问题标题】:Android - C++ compile errors in cygwin/android-ndkAndroid - cygwin/android-ndk 中的 C++ 编译错误
【发布时间】:2012-01-22 07:18:24
【问题描述】:

我创建了一个简单的应用程序来帮助我学习 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");
  }
}

【问题讨论】:

    标签: android c++ android-ndk cygwin


    【解决方案1】:

    由于错误状态,编译器不喜欢 vecLoad 中的内容。你确定 Vector3f 有正确的 '(' 运算符吗?我会先检查一下。

    【讨论】:

    • 嘿,感谢您的评论.....在查看了 eigen 教程后,我发现我没有使用正确的方法来加载数组,所以我将其更改为当前代码,编译器很喜欢它.现在我只需要清理最后几个错误,然后我就可以开始尝试在 java 中使用我的本机方法了 :) 但是你对最后几个错误有什么想法吗?
    • @Jamesandresakis 我注意到的一件事是 env 是一个指针,但 *env 是值。但是您使用通常用于指针的'->'。你不能在 C/C++ 中做float array1[];
    • 是的,我是从 jni 教程中学到的……我仍然不确定如何使用 jni 处理从 java 传递的参数到本机代码。我发现的大多数教程都缺少一件事或另一件事。
    • 声明一个浮点数组怎么样.....我看到的每一个地方你都像这样在 c++ 中声明一个数组..... int samp[2];这将创建一个包含两个点的数组.....至少我一直这么认为。
    • @Jamesandresakis 请阅读错误。它告诉你什么?据我所知,你很近。自己想办法。就是这么简单。
    【解决方案2】:

    第一个错误是由于 net 为 float array1[]; 指定了大小,与 java 不同,这是不允许的。另一方面,您可以将数组指定为 float *array1; 而无需对其进行初始化。

    第二个和第三个错误是指您在使用-&gt; 运算符之前取消引用您的指针。正确的做法是:

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

    最后一个错误是您遗漏了一个数字,看起来应该是 flt2[2] 而不是 flt[2]

    【讨论】:

    • 嘿,谢谢您的加入.....我继续为这样的数组指定了一个大小......array1 [3] ......编译器似乎喜欢这样美好的。我只需要数组来保存 3 个变量,所以声明它很好。我会尝试实现您建议的代码并回发。
    • 这似乎也不起作用.....现在我收到以下错误......错误:没有匹配函数调用'_JNIEnv::GetFloatArrayElements(JNIEnv*&, _jfloatArray *&, NULL)'
    • 如果您使用的是 C 与 C++,则调用会有所不同。在 C 中就是上述情况,在 C++ 中调用将是 env-&gt;GetFloatArrayElements(fltarray1, 0)。所有调用都相同,只需删除 env 参数即可。
    • 我实现了你的建议,它摆脱了与此相关的错误,但现在我只剩下以下内容了.....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返回
    • 我刚刚更新了最后一点 c++ 代码和相关的构建错误
    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2012-10-15
    • 2012-12-21
    相关资源
    最近更新 更多