2011-06-10 114 views
2

我得到了下面的代碼我templateApp.java內:發送加速度計C/C++

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中的init函數工作完美無缺。是否有什麼阻止我從擴展Activity的主文件調用本地API?因爲傳感器工作,我打印的價值其本機通話崩潰,我不知道爲什麼。

韓國社交協會提前!

回答

1

你有啓動本機代碼?這是我的,它位於類與本地方法暴露。

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

嗬!等待可能的電話發生之前(因爲加速計是該死的快)圖書館被加載!讓我檢查一下。 – McBob 2011-06-10 08:21:05

+0

這樣做...... Tks一堆! – McBob 2011-06-10 08:23:46

+0

OK等問題......值是錯誤的...它似乎有某種轉換的需要被一個jfloat之間做一個浮...是否有可能或? – McBob 2011-06-10 14:40:07

0

你忘了隱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你的情況)的。 對於非靜態函數,隱式參數將是調用對象的jobject。