I am trying to return a jintArray from C ++ to Java, but the application seems to hang in a JNI call. I shared the issue with the creation and population of jintArray, although I am not getting any errors. Any help is appreciated.
Check the project to make sure everything works:
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 << ' '; }
Output:
<000 000 000 000 000 000 000 00050570 00060512 000C04E0 | Number of Windows: 10
Java Code:
System.out.println("Get child windows"); System.out.println("Main handle: " + getHandle()); final int[] handles = getChildWindows(); System.out.println("Done getting childs");
Java output:
Running test child windows
Get child windows
Main handle: 525978
JNI Code:
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);
source share