C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)相关的知识,希望对你有一定的参考价值。

或者将枚举值转换到string类型的也行,要怎样转换啊?各位帮帮忙,感激不尽

参考技术A 映射倒可以解决,不过string类型的不能转换为enum类型,int类型可以转换为enum类型,enum常量在某些情况下也可以自动转换为int类型的常量。具体实现你应该能完成了吧。^-^

将 C++ 函数的返回类型映射到 Java 中的 byte[][]

【中文标题】将 C++ 函数的返回类型映射到 Java 中的 byte[][]【英文标题】:map return type of C++ function to byte[][] in Java 【发布时间】:2011-01-12 19:15:45 【问题描述】:

我有一个 c++ 函数声明为

unsigned char** 分类

我在 SWIG 中使用以下接口文件

%module PWrap
%include "std_string.i"
%include "arrays_java.i"

%apply byte[][] unsigned char**;

%
#include "Classifier.h"
%

%include "Classifier.h"

它生成了一些文件,包括一个 SWIGTYPE_p_p_unsigned_char 对象

现在,我尝试在 Java 中使用这个 C++ 函数:

SWIGTYPE_p_p_unsigned_char data = pc.classify();//this works, but I can't do anything with the data object execept pass it to other C++ functions expecting unsigned char**
byte[][] data2 =pc.classify();//this does not work - throws compile time error

那么我做错了什么才能让这个映射正常工作?我知道矩阵的维度,因为我将 args 传递给 C++ 函数来设置所有内容。换句话说,我很乐意以任何方式取回数据,只要我能以某种方式将其转换为 Java 中的字节即可。

【问题讨论】:

在 C++ 中 unsigned char ** 可以指向任何东西。是否有任何信息必须如何使用分类函数的结果?例如用户之后是否需要释放内存,用户应该如何使用矩阵? 用户不需要释放它或任何东西 - 只需使用它进入图像缓冲区 - 一次。 【参考方案1】:

char** 不是字节[][]。只有一维数组可以衰减为指针。你得到的是一个指向数组的指针数组,而不是一个数组数组。

【讨论】:

好吧,我实际上什么都没有得到——Java 程序中的第二行引发了编译器异常。你能详细说明一下吗?我是否需要使用类型映射将 unsigned char** 转换为 SOMETHING?【参考方案2】:

我最好使用直接 JNI 而不是 SWIG 来完全控制这些数据类型。

无论如何返回char ** 无效,因为array pinning 无法使用。可能这就是为什么你的 SWIG 包装器没有做你想做的事 - 你的 classify 应该接受 char ** 作为参数而不是返回它。我不知道 SWIG,所以这里有一些 JNI 代码。

Java 源代码:

package my;

public class Classifier 
    public native void init(); // initialize _ptr with a new Classifier
    public native void cleanup(); // destroy Classifier
    public native byte[][] classify();
    private long _ptr;

C/C++ 中的方法定义:

Classifier *getClassifierInstance(JNIEnv *env, jobject obj) 
    jfieldID id = env->GetFieldID(env->GetObjectClass(obj), "_ptr", "J");
    return (id == NULL) ? NULL : ((Classifier *)env->GetLongField(obj, id));


JNIEXPORT jobjectArray JNICALL
Java_my_Classifier_classify(JNIEnv *env, jobject obj) 
    Classifier *classifier = getClassifierInstance(env, obj);
    char **ptr = classifier->classify();
    jobjectArray result = NewObjectArray(env, MATRIX_HEIGHT, FindClass(env, "[B"), NewByteArray(env, 0));
    for (int i = 0; i < MATRIX_HEIGHT; ++i) 
        jbyteArray row = NewByteArray(env, MATRIX_WIDTH);
        SetByteArrayRegion(env, row, 0, MATRIX_WIDTH, ptr[i]);
        SetObjectArrayElement(env, result, i, row);
    
    return result;

【讨论】:

【参考方案3】:

看看http://www.ibiblio.org/pub/languages/fortran/append-c.html“为什么双指针不能用作二维数组?”

【讨论】:

以上是关于C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)的主要内容,如果未能解决你的问题,请参考以下文章

Swig:如何将 c++ 字符串 const & 类型映射到 python 字符串?

如何将C++中string类型的字符串赋给unsigned char数组

c++ 如何将string 转成 enum 类型,enum 转成 string类型,

c++ 如何将string类型的二进制转换为16进制?

如何仅针对键的子集有效地比较 C++ 中的两个字符串映射

C++学习笔记:string类型如何删除指定的字符