通过 JNI 从 c++ 获取 java 数组

Get java array from c++ via JNI

本文关键字:java 数组 获取 c++ JNI 通过      更新时间:2023-10-16

所以,我想从 c++ 获取 resultNative但resultNative是Java的。任何人都可以告诉我如何通过 JNI 做到这一点吗?我对c ++不是很熟悉,在谷歌上搜索了很长时间,但没有找到任何答案。非常感谢。nativeResult 在 Java 中。

public String[] searchDatabase()
{
    String result[]=new String[6];
    String nativeResult[]=new String[2];
    tName=this.getTargetName();
    result=da.SearchKorea(tName,ctx);
    tType=result[2];
    tTrans=result[3];
    tImage=result[4];
    tFave=result[5];
    nativeResult[1]= tImage+" - "+tName;
    nativeResult[2]= tTrans+" ["+tType+"]";
    return nativeResult;
}

首先,您必须获取对提供该方法的类的引用。假设您的类名为 MyClass,它位于包 p 中。你得到对类的引用,如下所示:

// You get the JNIEnv* pointer when calling a native function.
jclass myClass = env->FindClass("p/MyClass");

或者,如果您有对 java 对象的引用,那么您也可以使用 GetObjectClass

jclass myClass = env->GetObjectClass(javaObject);

然后,您必须通过提供方法的名称和描述方法签名的字符串来获取要调用的方法的 ID。

"()[java/lang/String;" describes a method expecting no arguments and returning a string array.
jmethodID methodID = env->GetMethodID(myClass , "searchDatabase", "()[java/lang/String;");

然后你必须用JNIEnv::CallObjectMethod调用该方法,这里你必须将引用传递给java对象。

jobjectarray strings = env->CallObjectMethod(javaObject, methodID);

然后你可以得到数组的一个元素 GetObjectArrayElement .

int index = 0;
jstring string = env->GetObjectArrayElement(strings, index);

然后,您可以通过各种方式从中获取本机字符串。

const char* nativeChars = env->GetStringUTFChars(string, nullptr);
您可以在此处找到有关 JNI

的更多信息,并在此处找到有关 JNI 类型签名的详细信息。

我相信

你可以通过传回一个jobjectArray来做到这一点。

int elements = 5;
jobjectArray returnArray = (jobjectArray)env->NewObjectArray(elements, env->FindClass("java/lang/string"), env->NewStringUTF(""));
for(int i = 0; i < elements; i++)
{
    char str[12];
    sprintf(str, "%i", i);
    env->SetObjectArrayElment(returnArray, i, env->NewStringUTF(str));
}
return returnArray;

我只用一个字节数组完成了这个