Отправка акселерометра в C / C ++ - PullRequest
2 голосов
/ 10 июня 2011

Я получил следующий код внутри моего templateApp.java:

    package com.android.templateApp;

    import android.app.Activity;
    import android.os.Bundle;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;

    public class templateApp extends Activity implements SensorEventListener
    {  
        GL2View mView;

        SensorManager mSensorManager;

        @Override protected void onCreate(Bundle icicle)
        {    
            super.onCreate( icicle );

            mSensorManager = ( SensorManager ) getSystemService( SENSOR_SERVICE );

            mView = new GL2View( getApplication() );

            mSensorManager.registerListener( this, 
                                             mSensorManager.getDefaultSensor( SensorManager.SENSOR_ACCELEROMETER ), 
                                             SensorManager.SENSOR_DELAY_GAME );

            setContentView( mView );
        }   

        @Override protected void onResume()
        {
            super.onResume();

            mView.onResume();
        }    


        public static native void Accelerometer( float x, float y, float z );

        public void onSensorChanged( SensorEvent event )
        {
            float x = event.values[ SensorManager.DATA_X ],
                  y = event.values[ SensorManager.DATA_Y ],
                  z = event.values[ SensorManager.DATA_Z ];

            // ALWAYS CRASH HERE!!!!
            Accelerometer( x, y, z );
        }

        public void onAccuracyChanged( Sensor sensor, int arg1 ) {}
    }

И внутри моего templateApp.cpp я получил следующее, чтобы соединить функцию акселерометра:

    extern "C"
    {
        JNIEXPORT void JNICALL Java_com_android_templateApp_GL2View_Init( JNIEnv *env, jobject obj,  jint width, jint height );


        JNIEXPORT void JNICALL Java_com_android_templateApp_templateApp_Accelerometer( JNIEnv *env, jfloat x, jfloat y, jfloat z );
    };

    JNIEXPORT void JNICALL Java_com_android_templateApp_GL2View_Init( JNIEnv *env, jobject obj,  jint width, jint height )
    { Init( width, height); }

    JNIEXPORT void JNICALL Java_com_android_templateApp_templateApp_Accelerometer( JNIEnv *env, jfloat x, jfloat y, jfloat z )
    { Accelerometer( x, y,z ); }

Когда янаведите указатель мыши на eclipse, чтобы показать, что вызов принадлежит com.android.templateApp.templateApp.Accelerometer, и это именно то, что я объявляю, однако всегда выдает сообщение об ошибке UnsatisfiedLinkError.что мое родное определение неверно) но оно продолжает падать при вызове акселерометра внутри java-кода ... Странно то, что моя функция инициализации, которая находится внутри моего GL2View.java, работает безупречно.Есть ли что-то, что мешает мне вызывать нативный API из основного файла, который расширяет Activity?Потому что датчик работает, я печатаю значение его родного вызова, что сбой, и я не знаю, почему.

Tks заранее!

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Вы инициировали свой родной код?Это мое, оно находится в классе с открытыми методами.

static {
    Log.v("NativeCodeWrapper.java", "Loading native libraries");
    System.loadLibrary("NameOfNativeModuleAsDefinedInAndroidDotMk");
}
0 голосов
/ 15 июня 2011

Вы забыли добавить неявный аргумент jclass / jobject к своей функции JNI:

JNIEXPORT void JNICALL Java_com_android_templateApp_templateApp_Accelerometer( JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z );

Аргумент 'clazz' будет классом Java вызывающего класса (в вашем случае templateApp).Для нестатических функций неявный аргумент будет заданием объекта вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...