从 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() 方法。