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