从 JNI (OpenCV putText) 获取字符串以显示在 Java
Get String from JNI (OpenCV putText) to display in Java
我正在构建一个应用程序来测量彩色圆圈之间的距离。我能够做到这一点,但我想将测量数据 (image) 保存到我在 Android 上创建的数据库中(table 在新的 activity 中)但是我不知道如何将绘制的字符串从 JNI 获取到我为数据库创建的 activity。
//put text
putText(mBgra, format("blue-green distance: %.2f cm ",conv3), Point(50,200), FONT_HERSHEY_SIMPLEX, 1, Scalar(0 , 255 , 0 , 255), 4);
如何从上面的代码中获取字符串并将其显示到新的 java activity?
假设有一个 Java class
class MyClass {
public String mSomething;
}
您将创建一个 MyClass 的对象并将其作为 jobject myClassObject.
传递给您的本机代码
然后在你的C++代码中你可以写
jclass myClass = env->GetObjectClass(myClassObject);
if (myClass != NULL) {
jfieldID fid = env->GetFieldID(MyClass, "mSomething", "Ljava/lang/String;");
if (fid != NULL) {
jstring jstr = env->NewStringUTF(format("blue-green distance: %.2f cm ",conv3).c_str());
env->SetObjectField(myClassObject, fid, jstr);
}
}
为了性能,fid 可能会被缓存和重复使用。如果您已经知道 fid,则无需获取 myClass。
这显示了如何 。
我假设
JNIEXPORT void JNICALL Java_com_example_alexies_objecttrackertest_UBackTrackViewer_UBackObjectTrack (JNIEnv * env , jobject ubackObject,
jint width , jint height, jbyteArray yuv, jintArray bgra, jboolean debug)
UBackTrackViewer ubackObject 是您要询问的 activity,它定义了字段
private TextView mBlueGreenDistance, mBlueYellowDistance, mMagentaRedDistance;
在加载 activity 的布局后,您可能会初始化这些字段以指向 onCreate()
中的实际文本视图。
然后在您的 JNI 代码中,您将拥有此初始化序列(在初始化 textview 字段后 运行 它就足够了):
jclass UBackTrackViewer_CLS = env->FindClass("com/example/alexies/objecttrackertest/UBackTrackViewer");
jclass TextView_CLS = env->FindClass("android/widget/TextView");
jmethodID setText_MID = env->GetMethodID(TextView_CLS, "setText", "(Ljava/lang/CharSequence;)V");
jfieldID mBlueGreenDistance_FID = env->GetFieldID(UBackTrackViewer_CLS, "mBlueGreenDistance", "Landroid/widget/TextView;");
…
现在,在这些全局变量的支持下,您可以将以下内容添加到您的本机方法中:
jobject mBlueGreenDistance_OBJ = env->GetObjectField(ubackObject, mBlueGreenDistance_FID);
jstring distance_STR = env->NewStringUTF(format("blue-green distance: %.2f cm", conv3).c_str());
env->CallVoidMethod(mBlueGreenDistance_OBJ, setText_MID, distance_STR);
在这种情况下不需要清理。不会发生内存或引用泄漏。请注意,必须从 UI 线程调用 setText() 方法。
我正在构建一个应用程序来测量彩色圆圈之间的距离。我能够做到这一点,但我想将测量数据 (image) 保存到我在 Android 上创建的数据库中(table 在新的 activity 中)但是我不知道如何将绘制的字符串从 JNI 获取到我为数据库创建的 activity。
//put text
putText(mBgra, format("blue-green distance: %.2f cm ",conv3), Point(50,200), FONT_HERSHEY_SIMPLEX, 1, Scalar(0 , 255 , 0 , 255), 4);
如何从上面的代码中获取字符串并将其显示到新的 java activity?
假设有一个 Java class
class MyClass {
public String mSomething;
}
您将创建一个 MyClass 的对象并将其作为 jobject myClassObject.
传递给您的本机代码然后在你的C++代码中你可以写
jclass myClass = env->GetObjectClass(myClassObject);
if (myClass != NULL) {
jfieldID fid = env->GetFieldID(MyClass, "mSomething", "Ljava/lang/String;");
if (fid != NULL) {
jstring jstr = env->NewStringUTF(format("blue-green distance: %.2f cm ",conv3).c_str());
env->SetObjectField(myClassObject, fid, jstr);
}
}
为了性能,fid 可能会被缓存和重复使用。如果您已经知道 fid,则无需获取 myClass。
这显示了如何
我假设
JNIEXPORT void JNICALL Java_com_example_alexies_objecttrackertest_UBackTrackViewer_UBackObjectTrack (JNIEnv * env , jobject ubackObject,
jint width , jint height, jbyteArray yuv, jintArray bgra, jboolean debug)
UBackTrackViewer ubackObject 是您要询问的 activity,它定义了字段
private TextView mBlueGreenDistance, mBlueYellowDistance, mMagentaRedDistance;
在加载 activity 的布局后,您可能会初始化这些字段以指向 onCreate()
中的实际文本视图。
然后在您的 JNI 代码中,您将拥有此初始化序列(在初始化 textview 字段后 运行 它就足够了):
jclass UBackTrackViewer_CLS = env->FindClass("com/example/alexies/objecttrackertest/UBackTrackViewer");
jclass TextView_CLS = env->FindClass("android/widget/TextView");
jmethodID setText_MID = env->GetMethodID(TextView_CLS, "setText", "(Ljava/lang/CharSequence;)V");
jfieldID mBlueGreenDistance_FID = env->GetFieldID(UBackTrackViewer_CLS, "mBlueGreenDistance", "Landroid/widget/TextView;");
…
现在,在这些全局变量的支持下,您可以将以下内容添加到您的本机方法中:
jobject mBlueGreenDistance_OBJ = env->GetObjectField(ubackObject, mBlueGreenDistance_FID);
jstring distance_STR = env->NewStringUTF(format("blue-green distance: %.2f cm", conv3).c_str());
env->CallVoidMethod(mBlueGreenDistance_OBJ, setText_MID, distance_STR);
在这种情况下不需要清理。不会发生内存或引用泄漏。请注意,必须从 UI 线程调用 setText() 方法。