我的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 ); }


当我将鼠标移过日食时,表明该呼叫属于
com.android.templateApp.templateApp.Accelerometer,这正是我声明的内容,但是它始终崩溃,报告UnsatisfiedLinkError。

我尝试了每种组合(假设我的本机定义是错误的),但是在Java代码内的Accelerometer调用中它总是崩溃...奇怪的是,我在GL2View.java内的init函数工作正常。是否有什么阻止我从扩展Activity的主文件中调用本机API的?因为传感器工作,我将值打印为崩溃的本机调用,但我不知道为什么。

提前谢谢!

最佳答案

您是否启动了本机代码?这是我的,它位于具有公开本机方法的类中。

static {
    Log.v("NativeCodeWrapper.java", "Loading native libraries");
    System.loadLibrary("NameOfNativeModuleAsDefinedInAndroidDotMk");
}

10-07 15:41