gpt4 book ai didi

java - 实例化自定义 java 对象,通过 C++ 代码在此对象上设置二维字符串和浮点 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:31 26 4
gpt4 key购买 nike

我需要将回调传递给自定义对象中的 Java 代码。这是我想用 C++ 代码编写的自定义类。

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;
}
}

Recognizer 类与 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 数组强>

感谢您的帮助!

已编辑!

识别器是这样的,我首先尝试使用一维数组 ... jclass 测试; jmethodID testemtdid; 工作对象测试对象; jstring 测试器; jobjectArray testearray; 诠释我;

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;

输出是,当我尝试实例化字符串类型的对象时它崩溃了。

Rec cls
Rec mtdid
Rec obj
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb6dbf389, pid=15337, tid=1769995120
#
# JRE version: 6.0_24-b07
# Java VM: Java HotSpot(TM) Server VM (19.1-b02 mixed mode linux-x86 )
# Problematic frame:
# V [libjvm.so+0x3e0389]
#
# An error report file with more information is saved as:
# /home/10080000701/workspace/jlapsapi/hs_err_pid15337.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

你有什么建议?

最佳答案

你需要调用 Result 的构造函数,然后操作它的字段。

要调用创建 Result 的新实例,必须像这样调用构造函数:

jclass resultClass = env->FindClass("Lbr/ufpa/laps/jlapsapi/recognizer/Result");
jmethodID cid = env->GetMethodID(resultClass, "<init>", "()V");
jobject theObject = env->NewObject(resultClass, cid);

要创建一个新的字符串数组 (String[][]),请执行以下操作:

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);
}

然后您可以将 strArrArr 传递给 setUtterance(String[][])

关于java - 实例化自定义 java 对象,通过 C++ 代码在此对象上设置二维字符串和浮点 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8312866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com