自定义C++ java对象,从C++代码中设置二维字符串和浮点向量
我需要在自定义对象中向java代码传递回调。这是我的自定义类,我想用C++代码编写。自定义C++ java对象,从C++代码中设置二维字符串和浮点向量,java,c++,java-native-interface,Java,C++,Java Native Interface,我需要在自定义对象中向java代码传递回调。这是我的自定义类,我想用C++代码编写。 public class Result { private String utterance[][]; private float confidence[][]; public String[][] getUtterance() { return utterance; } public float[][] getConfidence() {
public class Result {
private String utterance[][];
private float confidence[][];
public String[][] getUtterance() {
return utterance;
}
public float[][] getConfidence() {
return confidence;
}
public void setUtterance(String utterance[][]) {
this.utterance = utterance;
}
public void setConfidence(float confidence[][]) {
this.confidence = confidence;
}
}
类识别器与JNI进行通信。于是,她收到了回电
public class Recognizer {
private Result result;
Recognizer(){
System.load(LibNameLoader.libRoot(jarLibPath);
}
...
private void newResultCallback(Result result){//C++ send this object to java
this.result = result;
}
}
<>这是我的C++代码,它是我的C++对象,在java中也是一样。记住这是回拨,我不能更改签名
void Recognized(RecoResult *result){
//class package
jclass cls = env->FindClass("Lbr/ufpa/laps/jlapsapi/recognizer/Result;");
jobject theObject; //i don't how to manipulate this one and set it arrays
int row = result->sentenceNumber; //Vertical array lenght
int column = result->wordsNumber; //Horizontal array lenght
string *ptrUtterance = result->getUtterancePtr(); //simple acess ptrUtterance[i][j]
float *ptrConfidence = result->getConfidencePtr(); // " " ptrconfidence[i][j]
jstring utteranceArray[row][column];
jfloat floatArray[row][column];
env->CallVoidMethod(obj_, midU, theObject);
//obj_ is global and has the reference to java Recognizer class
//midU is the reference to java method called
//theObject is the object that java will receive
}
我只需要帮助设置对象内部的数组字段。或者我可以使用以下方法发送jstring和jfloat数组env->CallVoidMethodobj_2;,midU1,jstringArray;和env->CallVoidMethodobj_2;、midU2、jfloatArray
谢谢你的帮助
编辑
识别器是这样的,我首先尝试使用一维数组
...
jclass testecls;
jmethodide testemtdide;
jobject testeobj;
jstring-testestr;
jobjectArray;
int i
cout << "Rec cls"<< endl;
testecls = env->FindClass("Ljava/lang/String;");
if(testecls==NULL)
cout << "Rec cls = NULL"<< endl;
cout << "Rec mtdid"<< endl;
testemtdid = env->GetMethodID(testecls,"<init>","(Ljava/lang/String;)V");
if(testemtdid==NULL)
cout << "Rec mtdid = NULL"<< endl;
cout << "Rec obj"<< endl;
testeobj = env->NewObject(testecls, NULL);
if(testeobj==NULL)
cout << "Rec obj = NULL"<< endl;
cout << "Rec str"<< endl;
testestr = env->NewStringUTF(result->getUtterance().c_str());
if(testestr==NULL)
cout << "Rec str = NULL"<< endl;
cout << "Rec array"<< endl;
testearray = env->NewObjectArray(result->wordsNumber, testecls, testeobj);
if(testearray==NULL)
cout << "Rec array = NULL"<< endl;
for(i=0;i<result->wordsNumber;i++){
cout << "Rec setarray"<< endl;
env->SetObjectArrayElement(testearray, i, testestr);
}
cout << "Rec before call"<< endl;
env->CallVoidMethod(obj_, midUArray, testearray);
cout << "Rec after call"<< endl;
您有什么建议?您需要调用Result的构造函数,然后操作该构造函数的字段 要调用并创建结果的新实例,必须按如下方式调用构造函数:
jclass resultClass = env->FindClass("Lbr/ufpa/laps/jlapsapi/recognizer/Result");
jmethodID cid = env->GetMethodID(resultClass, "<init>", "()V");
jobject theObject = env->NewObject(resultClass, cid);
然后,您可以将strArrArr传递给SetuthEssentialing[].您需要调用Result的构造函数,然后操作该构造函数的字段 要调用并创建结果的新实例,必须按如下方式调用构造函数:
jclass resultClass = env->FindClass("Lbr/ufpa/laps/jlapsapi/recognizer/Result");
jmethodID cid = env->GetMethodID(resultClass, "<init>", "()V");
jobject theObject = env->NewObject(resultClass, cid);
然后,您可以将strArrArr传递给SetutterSequenting[][]。您是遇到编译时错误还是运行时错误?如果是这样,请发布它。我编辑过,我正在使用最后的代码来测试您是否遇到编译时或运行时错误?如果是,请发布它。我编辑了,我正在使用最后的代码进行测试
jclass strArrArrCls = env->FindClass("[[Ljava/lang/String;");
jclass strArrCls = env->FindClass("[Ljava/lang/String;");
jobjectArray strArrArr = env->NewObjectArray(row, strArrArrCls, NULL);
for(i = 0; i < row; i++) {
jobjectArray strArr = env->NewObjectArray(column);
jfloat tmp[3];
for(j = 0; j < colummn; j++) {
jstring tmp = env->NewStringUTF(ptrUtterance[row][column].c_str());
env->SetObjectArrayElement(strArr, j, tmp);
}
env->SetObjectArrayElement(strArrArr, i, strArr);
env->DeleteLocalRef(strArr);
}