gpt4 book ai didi

java - 从 JNI 返回 jintArray

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:26 25 4
gpt4 key购买 nike

我正在尝试将 jintArray 从 C++ 返回到 Java,但应用程序似乎在 JNI 调用中挂起。我已将问题简化为 jintArray 的创建和填充,尽管我没有收到任何错误。感谢您的帮助。

测试项目以确保一切正常:

include "stdafx.h"
include "windows.h"
include <vector>
include <iostream>
include <jni.h>

using namespace std;

std::vector<jint> childWindows;

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
childWindows.push_back((jint) hwnd);
return TRUE;
}

jint* getChildWindows(HWND hWnd) {
childWindows.clear();
::EnumChildWindows(hWnd, EnumChildProc, NULL);

int len = static_cast<int>(childWindows.size());

jint values[100];
std::copy(childWindows.begin(), childWindows.end(), values);


for (std::vector<jint>::const_iterator i = childWindows.begin(); i != childWindows.end(); ++i) {
std::cout << (HWND)*i << ' ';
}
//env->SetIntArrayRegion(childeren, 0, len, values);
return values;
}


int _tmain(int argc, _TCHAR* argv[])
{
getChildWindows((HWND)1377258);

std::cout << " | Windows count: " << childWindows.size() << " ";
return 0;
}

输出:

000D0550 000B04F2 001C047A 0002055E 00020558 00010564 0007054E 00050570 00060512 000C04E0 | Windows count: 10

Java代码:

    System.out.println("Get child windows");
System.out.println("Main handle: " + getHandle());
final int[] handles = getChildWindows();
System.out.println("Done getting childs");

Java 输出:

Starting test child windows

Get child windows

Main handle: 525978

JNI代码:

JNIEXPORT jintArray JNICALL Java_main_getChildWindows(JNIEnv *env, jclass c) {
childWindows.clear();
::EnumChildWindows(hWnd, EnumChildProc, NULL);

int len = static_cast<int>(childWindows.size());
jintArray childeren = env->NewIntArray(len);

jint values[100];
std::copy(childWindows.begin(), childWindows.end(), values);

env->SetIntArrayRegion(childeren, (jsize)0, (jsize)len, values);
//env->ReleaseIntArrayElements(childeren, values, 0);
return childeren;
}

最佳答案

您没有在 JNI 调用后检查错误。这可能会导致这样一种情况,即您的代码崩溃不是发生在出错的地方,而是发生在下一个调用 JVM 的地方。当发生这种情况时,您不会得到任何友好意义上的“错误”——您获得这些错误的机会是检查返回值并查询 JVM 以查找未决异常。 (见下文。)

以你的情况为例,如果

jintArray childeren = env->NewIntArray(len)

生成异常(在 JVM 中的 Java 中),您的代码将继续在 native 代码中越过该行,但 JVM 仍将保留该异常。下次您调入 JVM 时,恰好是您确定设置数组值的行,代码将崩溃。您需要明确清除异常。

无论如何,您应该检查返回值并检查异常。 (请参阅 ExceptionOccurred 和 ExceptionClear 的 JNI 文档。)我敢打赌,由于某种原因,您未能获得分配的数组。从你的代码中我不清楚为什么会发生这种情况,但这会给你一个具体的起点,即如果你有异常或者你有一个空引用,它会给你关于出错的信息。它还可能会将您的搜索转移到出现问题的位置。

祝你好运!

关于java - 从 JNI 返回 jintArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31976830/

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