When I run my plugin onSensorChanged won't trigger, leaving me without any information from the sensors.
Here is my Java Class code:
package com.skanska.helloandroid;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class HelloAndroidActivity extends Activity implements SensorEventListener{
private SensorManager mSensorManager;
private float[] mGData = new float[3];
private float[] mMData = new float[3];
private float[] mR = new float[16];
private float[] mI = new float[16];
private float[] mOrientation = new float[3];
private Sensor msensor, gsensor;
public float deg = 0;
private String degString;
public HelloAndroidActivity(Activity currentActivity) {
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
msensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mSensorManager.registerListener(this, gsensor, SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this, msensor, SensorManager.SENSOR_DELAY_GAME);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
int type = event.sensor.getType();
if (type == Sensor.TYPE_ACCELEROMETER) {
for (int i=0 ; i<3 ; i++)
mGData[i] = event.values[i];
}
else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
for (int i=0 ; i<3 ; i++)
mMData[i] = event.values[i];
}
else {
return;
}
SensorManager.getRotationMatrix(mR, mI, mGData, mMData);
SensorManager.getOrientation(mR, mOrientation);
final float radtodeg = (float)(180.0f/Math.PI);
deg = mOrientation[0]*radtodeg;
}
public String getDeg(){
degString = Float.toString(deg);
return degString;
}
}
My javabridge(.cpp):
include <stdlib.h>
include <jni.h>
include <android/log.h>
extern "C"
{
JavaVM* java_vm;
jobject HelloAndroidActivity;
jmethodID getDeg;
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
java_vm = vm;
JNIEnv* jni_env = 0;
java_vm->AttachCurrentThread(&jni_env, 0);
jclass cls_Activity = jni_env->FindClass("com/unity3d/player/UnityPlayer");
jfieldID fid_Activity = jni_env->GetStaticFieldID(cls_Activity, "currentActivity", "Landroid/app/Activity;");
jobject obj_Activity = jni_env->GetStaticObjectField(cls_Activity, fid_Activity);
jclass cls_HelloAndroidActivity = jni_env->FindClass("com/skanska/helloandroid/HelloAndroidActivity");
jmethodID mid_HelloAndroidActivity = jni_env->GetMethodID(cls_HelloAndroidActivity, "<init>", "(Landroid/app/Activity;)V");
jobject obj_HelloAndroidActivity = jni_env->NewObject(cls_HelloAndroidActivity, mid_HelloAndroidActivity, obj_Activity);
HelloAndroidActivity = jni_env->NewGlobalRef(obj_HelloAndroidActivity);
getDeg = jni_env->GetMethodID(cls_HelloAndroidActivity, "getDeg", "()Ljava/lang/String;");
return JNI_VERSION_1_6;
}
char* dec = 0;
const char* getDeclination()
{
JNIEnv* jni_env = 0;
java_vm->AttachCurrentThread(&jni_env, 0);
jstring str_dec = (jstring)jni_env->CallObjectMethod(HelloAndroidActivity, getDeg);
jsize stringLen = jni_env->GetStringUTFLength(str_dec);
dec = new char[stringLen+1];
const char* content = jni_env->GetStringUTFChars(str_dec, 0);
strcpy(dec, content);
return dec;
}
}
My C# Call javacode script:
using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
public class CallJavaCode : MonoBehaviour {
[DllImport("javabridge")]
private static extern IntPtr getDeclination();
public float deg;
private string decString;
IntPtr stringPtr = getDeclination();
void Start ()
{
stringPtr=getDeclination();
Debug.Log("stringPtr = " +stringPtr);
String cache = Marshal.PtrToStringAnsi(stringPtr);
Debug.Log("getDeclination returned " + cache);
decString = cache;
deg = float.Parse(decString);
Debug.Log("Deg= " + deg);
transform.eulerAngles = new Vector3(0, 0, deg);
}
void Update()
{
stringPtr = getDeclination();
Debug.Log("stringPtr = " +stringPtr);
String cache = Marshal.PtrToStringAnsi(stringPtr);
Debug.Log("getDeclination returned " + cache);
decString = cache;
deg = float.Parse(decString);
transform.eulerAngles = new Vector3(0, 0, deg);
Debug.Log("Deg = " + deg);
}
void OnGUI ()
{
GUI.Label(new Rect (15, 125, 450, 100), decString);
}
}
I might aswell post my manifest since I have no clue what so ever manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.skanska.helloandroid"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="11" />
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name=".HelloAndroidActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Am I missing something obvious? Is it even possible to make a event based plugin?
Thanks in advance,
Martin
asked
Jun 21 '11 at 02:34 PM
HolmMa
1
●
1
●
1
●
1