Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get java array from c++ via JNI

So, I want to obtain resultNative from c++ but resultNative is in Java. can anybody please show me how to do that via JNI? I am not so familiar with c++ and have searched google for a long time but didn't find any answer. thank you so much. the nativeResult is here in 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;
}
like image 841
user3158109 Avatar asked Jun 06 '26 17:06

user3158109


1 Answers

First you have to get a reference to the class providing the method. Let's say your class is called MyClass and it is in package p. You get the reference to the class like this:

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

Or if you have a reference to the java object then you can also use GetObjectClass:

jclass myClass = env->GetObjectClass(javaObject);

Then you have to get the ID of the method you'd like to call by providing the name of the method and a string describing the signature of the method.

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

Then you have to call the method with JNIEnv::CallObjectMethod, and here you have to pass the referenc to the java object.

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

Then you can get an element of the array with GetObjectArrayElement.

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

And then you can get the native string from it in various ways.

const char* nativeChars = env->GetStringUTFChars(string, nullptr);

You can find more information about JNI here, and details about JNI type signatures here.

like image 189
Mark Vincze Avatar answered Jun 09 '26 07:06

Mark Vincze



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!