android - 在 JNI 中提取 SensorEvent
问题描述
我是 JNI 编程的新手。我想在 JNI 中做一个 sensorEvent解析工作来获取float arrays 格式的sensorEvent.values。
但我不知道如何提取对象 sensorEvent以在 JNI 上获取sensorEvent.values?
// JAVA
public class MySensor {
// load native dll
static {
System.loadLibrary("example");
}
// this native function will be call by onSensorChanged()
private native void parse(SensorEvent sensorEvent);
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent != null) {
// content of sensorEvent.values is
// sensorEvent.values[0] = 1.0f
// sensorEvent.values[1] = 1.1f
// sensorEvent.values[1] = 1.2f
parse(sensorEvent); // do this job in JNI
}
}
}
// JNI
JNIEXPORT void JNICALL
Java_com_company_MySensor_parse(JNIEnv *env, jobject instance, jobject sensorEvent) {
// how to extract sensorEvent to get sensorEvent.values and show values?
//???
printf("SensorEvent.values[0]= %f", sensorEvent.values[0]); // 1.0f
printf("SensorEvent.values[1]= %f", sensorEvent.values[1]); // 1.1f
printf("SensorEvent.values[2]= %f", sensorEvent.values[2]); // 1.2f
}
解决方案
根据@Michael 的信息,我找到了答案。谢谢你们。
const char *CLS_SENSOR_EVENT = "android/hardware/SensorEvent";
const char *FLD_VALUES = "values";
const char *SIG_VALUES = "[F";
jfloat getSensorValue(JNIEnv *env, jobject sensorEvent) {
jboolean* isCopy = JNI_FALSE;
jclass clsSensorEvent = env->FindClass(CLS_SENSOR_EVENT);
if (NULL == clsSensorEvent) {
return -1;
}
jfieldID fldValues = env->GetFieldID(clsSensorEvent, FLD_VALUES, SIG_VALUES);
if (NULL == fldValues) {
return -1;
}
jobject objValues = env->GetObjectField(sensorEvent, fldValues);
if (NULL == objValues) {
return -1;
}
jfloatArray floArrValues = reinterpret_cast<jfloatArray>(objValues);
jfloat *flo = env->GetFloatArrayElements(floArrValues, isCopy);
if (NULL == *flo) {
return -1;
}
jfloat result = flo[0];
env->ReleaseFloatArrayElements(floArrValues, flo, 0);
return result;
}
推荐阅读
- javascript - 如何使用 Javascript 在 Firestore 中获取用户文档 ID?
- flutter - 如何在flutter中从record_mp3包中为api上传mp3文件
- c - 通过文件系统驱动程序跟踪复制/粘贴
- sql-server - 尝试使用 1 到非常多的 JOIN 进行查询时,GraphQL 会破坏 SQL Server 吗?这样的 JOIN 会引起什么问题?
- spring-boot - Spring Endpoint - 从soap请求中获取CDATA内容
- ios - 应用内购买:分层 | 如何使用相同的product_id
- excel - 使用openpyxl阻止excel中的第一行
- react-native - 哪个广告网络 npm 包目前适用于 ReactNative?
- javascript - 我无法使用类型模块在 addblogger.js 中执行我的有效函数
- odoo - 如何更改对编辑序列的访问权限