Ik denk dat ik iets fout doe met mijn geheugen allocatie en/of memory access.
Ik kom er niet meer uit, ik denk dat ik iets niet goed doe met mijn pointers of mijn malloc calls.
Ik heb heb al een paar uur lopen debuggen op dit probleem, maar ik snap niet waarom het niet werkt.
Dit is mijn simpele test programma met JNI:
De foutmelding is:
Zoals je kan zie gaat de malloc call goed (geen NULL als result), maar crasht ie zodra ik een (volgens mij) goede waarde probeer te accessen (namelijk data[1]).
Mijn doel is om de data en arrayOfArrays te vullen in de getArrays methode zodat ze toegankelijk zijn in de JNI test methode.
Ik kom er niet meer uit, ik denk dat ik iets niet goed doe met mijn pointers of mijn malloc calls.
Ik heb heb al een paar uur lopen debuggen op dit probleem, maar ik snap niet waarom het niet werkt.
Dit is mijn simpele test programma met JNI:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| bool getArrayOfArrays(JNIEnv *env, jobjectArray* arrays, jbyteArray** arrayOfArrays, jbyte*** data, int numArrays) { printf("Allocating arrayOfArrays\n"); arrayOfArrays = (jbyteArray**)malloc(sizeof(jbyteArray*) * numArrays); *arrayOfArrays = (jbyteArray*)malloc(sizeof(jbyteArray) * numArrays); printf("Allocating *data\n"); *data = (jbyte**)malloc(sizeof(jbyte**) * numArrays); printf("Allocating **data\n"); **data = (jbyte*)malloc(sizeof(jbyte*) * numArrays); printf("*array = %d\n", *arrays); printf("*arrayOfArrays = %d\n", *arrayOfArrays); printf("*data = %d\n", *data); printf("accessing data\n"); *data[0] = env->GetByteArrayElements((jbyteArray)env->GetObjectArrayElement(*arrays, 0), NULL); printf("accessing data[1]\n"); *data[1] = NULL; // HIER is de crash. printf("returning\n"); return true; } JNIEXPORT void JNICALL Java_Application_test (JNIEnv *env, jclass clazz, jobjectArray array) { jbyteArray* arrayOfArrays = NULL; jbyte** data = NULL; printf("array = %d\n", array); printf("arrayOfArrays = %d\n", arrayOfArrays); printf("data = %d\n",data); getArrayOfArrays(env, &array, &arrayOfArrays, &data, 2); //numArrays = 2 printf("array = %d\n", array); printf("arrayOfArrays = %d\n", arrayOfArrays); printf("data = %d\n",data); } |
Java:
1
2
3
4
5
6
7
8
9
10
11
12
| public class Application { static { System.loadLibrary("Test"); } public static native void test(byte[][] test); public static void main(String[] args) { test(new byte[2][2048]); } } |
De foutmelding is:
en de output voordat ie crasht is:# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007fd3ff13ad1, pid=10036, tid=2892
code:
1
2
3
4
5
6
7
8
9
10
11
| array = 42332584 arrayOfArrays = 0 data = 0 Allocating arrayOfArrays Allocating *data Allocating **data *array = 42332584 *arrayOfArrays = 12404624 *data = 12405824 accessing data accessing data[1] |
Zoals je kan zie gaat de malloc call goed (geen NULL als result), maar crasht ie zodra ik een (volgens mij) goede waarde probeer te accessen (namelijk data[1]).
Mijn doel is om de data en arrayOfArrays te vullen in de getArrays methode zodat ze toegankelijk zijn in de JNI test methode.