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

时间:2014-01-11 17:21:13

标签: java android c++ arrays java-native-interface

所以,我想从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;
}

2 个答案:

答案 0 :(得分:1)

首先,您必须获得提供该方法的类的引用。假设您的类名为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调用方法,在这里你必须将referenc传递给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 here的更多信息,以及有关JNI类型签名here的详细信息。

答案 1 :(得分:0)

我相信你可以通过传回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;

我只用字节数组

完成了这个