Sto cercando di restituire un jintArray da C++ a Java, ma l'applicazione sembra bloccarsi nella chiamata JNI. Ho ridotto il problema alla creazione e alla popolazione del jintArray, anche se non ricevo errori. Qualsiasi aiuto è apprezzato.Restituzione di jintArray da JNI
progetto di prova per assicurarsi che tutto funzioni:
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;
}
uscita:
000D0550 000B04F2 001C047A 0002055E 00020558 00010564 0007054E 00050570 00060512 000C04E0 | contano di Windows: 10 Codice
Java:
System.out.println("Get child windows");
System.out.println("Main handle: " + getHandle());
final int[] handles = getChildWindows();
System.out.println("Done getting childs");
Java uscita:
partire finestre figlio prova
Scarica Windows bambino
maniglia principale: 525.978
codice 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;
}
Hai considerato di aggiungere lo stesso tipo di traccia al metodo JNI che hai nel primo bit del codice C? – EJP
prova a chiamare getChildWindows() in una discussione separata – user2543253