【问题标题】:Get java array from c++ via JNI通过 JNI 从 c++ 获取 java 数组
【发布时间】:2014-01-30 16:04:57
【问题描述】:

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

【问题讨论】:

  • 您必须从 C++ 调用。创建一个 JVM 实例,找到 searchDatabase 并调用它。这是 C++ 调用 java 函数的唯一方法。否则,您需要从 java 调用 C++ 函数并将 searchDatabase 的结果传递给它。
  • 从您的文本中不清楚您希望从 Java 接收 Strings 的数组以用于 C 代码;你想编辑你的问题吗?实际上,有两种不同的场景:从 Java 中向 C 函数提供 String[] 参数,或者使用 searchDatabase() 方法作为 C 代码中的 回调

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


【解决方案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调用方法,这里你必须将引用传递给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 的详细信息。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我的意思是,我的 c++ 需要来自 java 的 nativeResult,我怎样才能在 c++ 中创建一个函数来从 java 获取 nativeResult?
    • 您的 JNI 代码将接收一个 jobjectArray 作为其参数之一。您可以使用 env->GetObjectArrayElement 来获取单个作业项目。将其转换为 jString 并使用 env->GetStringUTFChars(env, STRING_VAR_HERE); 将其转换为 c 字符串;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多