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数组