mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-23 01:29:33 +00:00
towards adding support for 64-bit architectures: registering relative memory addresses with contiki instead of fetching absolute addresses to java
This commit is contained in:
parent
a59cbaf19f
commit
11fa5a9a6b
@ -26,7 +26,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: Level4.java,v 1.3 2007/09/18 11:35:11 fros4943 Exp $
|
* $Id: Level4.java,v 1.4 2008/11/20 16:22:28 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@ -45,7 +45,8 @@ public class Level4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private native void doCount();
|
private native void doCount();
|
||||||
private native int getRefAddress();
|
|
||||||
|
public native void setReferenceAddress(int addr);
|
||||||
|
|
||||||
public Level4() {
|
public Level4() {
|
||||||
// Configure logger
|
// Configure logger
|
||||||
@ -152,12 +153,9 @@ public class Level4 {
|
|||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int absRefAddress = getRefAddress();
|
|
||||||
System.out.println("Absolute reference address: 0x" + Integer.toHexString(absRefAddress));
|
|
||||||
int relRefAddress = (Integer) addresses.get("ref_var");
|
int relRefAddress = (Integer) addresses.get("ref_var");
|
||||||
System.out.println("Relative reference address: 0x" + Integer.toHexString(relRefAddress));
|
System.out.println("Relative reference address: 0x" + Integer.toHexString(relRefAddress));
|
||||||
int offsetRelToAbs = absRefAddress - relRefAddress;
|
setReferenceAddress(relRefAddress);
|
||||||
System.out.println("Offset relative-absolute: 0x" + Integer.toHexString(offsetRelToAbs));
|
|
||||||
|
|
||||||
doCount();
|
doCount();
|
||||||
doCount();
|
doCount();
|
||||||
|
@ -26,16 +26,27 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: level4.c,v 1.2 2007/09/10 14:07:12 fros4943 Exp $
|
* $Id: level4.c,v 1.3 2008/11/20 16:22:28 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int ref_var;
|
long ref_var; /* Placed somewhere in the BSS section */
|
||||||
|
|
||||||
int initialized_counter=1;
|
int initialized_counter=1; /* Variable in data section */
|
||||||
int uninitialized_counter;
|
int uninitialized_counter; /* Variable in BSS section */
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_Level4_setReferenceAddress(JNIEnv *env, jobject obj, jint addr)
|
||||||
|
{
|
||||||
|
/*printf("relative reference address is %p\n", addr);*/
|
||||||
|
/*printf("absolute reference address is %p\n", &ref_var);*/
|
||||||
|
|
||||||
|
ref_var = (((long)&ref_var) - ((long)addr));
|
||||||
|
printf("Offset is 0x%p\n", ref_var);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_Level4_doCount(JNIEnv *env, jobject obj)
|
Java_Level4_doCount(JNIEnv *env, jobject obj)
|
||||||
@ -43,8 +54,3 @@ Java_Level4_doCount(JNIEnv *env, jobject obj)
|
|||||||
printf(">> DATA_counter=\t%i\tBSS_counter=\t%i\n", initialized_counter++, uninitialized_counter++);
|
printf(">> DATA_counter=\t%i\tBSS_counter=\t%i\n", initialized_counter++, uninitialized_counter++);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
JNIEXPORT jint JNICALL
|
|
||||||
Java_Level4_getRefAddress(JNIEnv *env, jobject obj)
|
|
||||||
{
|
|
||||||
return (jint) &ref_var;
|
|
||||||
}
|
|
||||||
|
@ -26,14 +26,14 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: Level5.java,v 1.4 2007/09/18 11:35:11 fros4943 Exp $
|
* $Id: Level5.java,v 1.5 2008/11/20 16:22:28 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
import org.apache.log4j.xml.DOMConfigurator;
|
|
||||||
|
|
||||||
|
import org.apache.log4j.BasicConfigurator;
|
||||||
import se.sics.cooja.GUI;
|
import se.sics.cooja.GUI;
|
||||||
import se.sics.cooja.SectionMoteMemory;
|
import se.sics.cooja.SectionMoteMemory;
|
||||||
import se.sics.cooja.contikimote.ContikiMoteType;
|
import se.sics.cooja.contikimote.ContikiMoteType;
|
||||||
@ -46,9 +46,10 @@ public class Level5 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private native void doCount();
|
private native void doCount();
|
||||||
private native int getRefAddress();
|
|
||||||
public native void getMemory(int start, int length, byte[] mem);
|
public native void setReferenceAddress(int addr);
|
||||||
public native void setMemory(int start, int length, byte[] mem);
|
public native void getMemory(int addr, int length, byte[] mem);
|
||||||
|
public native void setMemory(int addr, int length, byte[] mem);
|
||||||
|
|
||||||
private int javaDataCounter = 1;
|
private int javaDataCounter = 1;
|
||||||
private int javaBssCounter = 0;
|
private int javaBssCounter = 0;
|
||||||
@ -56,7 +57,7 @@ public class Level5 {
|
|||||||
public Level5() {
|
public Level5() {
|
||||||
|
|
||||||
// Configure logger
|
// Configure logger
|
||||||
DOMConfigurator.configure(GUI.class.getResource("/" + GUI.LOG_CONFIG_FILE));
|
BasicConfigurator.configure();
|
||||||
|
|
||||||
// Load configuration
|
// Load configuration
|
||||||
System.out.println("Loading COOJA configuration");
|
System.out.println("Loading COOJA configuration");
|
||||||
@ -126,16 +127,15 @@ public class Level5 {
|
|||||||
bssSectionSize = ContikiMoteType.loadBssSectionSize(mapData);
|
bssSectionSize = ContikiMoteType.loadBssSectionSize(mapData);
|
||||||
}
|
}
|
||||||
|
|
||||||
int absRefAddress = getRefAddress();
|
|
||||||
int relRefAddress = (Integer) addresses.get("ref_var");
|
int relRefAddress = (Integer) addresses.get("ref_var");
|
||||||
int offsetRelToAbs = absRefAddress - relRefAddress;
|
setReferenceAddress(relRefAddress);
|
||||||
|
|
||||||
System.out.println("Creating section memory");
|
System.out.println("Creating section memory");
|
||||||
byte[] initialDataSection = new byte[dataSectionSize];
|
byte[] initialDataSection = new byte[dataSectionSize];
|
||||||
byte[] initialBssSection = new byte[bssSectionSize];
|
byte[] initialBssSection = new byte[bssSectionSize];
|
||||||
|
|
||||||
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
|
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
|
||||||
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
|
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
|
||||||
SectionMoteMemory memory = new SectionMoteMemory(addresses);
|
SectionMoteMemory memory = new SectionMoteMemory(addresses);
|
||||||
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
||||||
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
||||||
@ -145,8 +145,14 @@ public class Level5 {
|
|||||||
System.out.print("Checking initial values: ");
|
System.out.print("Checking initial values: ");
|
||||||
dataCounter = memory.getIntValueOf("initialized_counter");
|
dataCounter = memory.getIntValueOf("initialized_counter");
|
||||||
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
||||||
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
|
if (dataCounter != javaDataCounter) {
|
||||||
|
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
|
||||||
System.out.println("FAILED!");
|
System.out.println("FAILED!");
|
||||||
|
System.exit(1);
|
||||||
|
} else if (bssCounter != javaBssCounter) {
|
||||||
|
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
|
||||||
|
System.out.println("FAILED!");
|
||||||
|
System.exit(1);
|
||||||
} else {
|
} else {
|
||||||
System.out.println("OK!");
|
System.out.println("OK!");
|
||||||
}
|
}
|
||||||
@ -159,13 +165,18 @@ public class Level5 {
|
|||||||
doCount(); javaDataCounter++; javaBssCounter++;
|
doCount(); javaDataCounter++; javaBssCounter++;
|
||||||
|
|
||||||
System.out.print("Checking increased values: ");
|
System.out.print("Checking increased values: ");
|
||||||
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
|
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
|
||||||
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
|
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
|
||||||
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
||||||
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
||||||
dataCounter = memory.getIntValueOf("initialized_counter");
|
dataCounter = memory.getIntValueOf("initialized_counter");
|
||||||
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
||||||
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
|
if (dataCounter != javaDataCounter) {
|
||||||
|
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
|
||||||
|
System.out.println("FAILED!");
|
||||||
|
System.exit(1);
|
||||||
|
} else if (bssCounter != javaBssCounter) {
|
||||||
|
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
|
||||||
System.out.println("FAILED!");
|
System.out.println("FAILED!");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
} else {
|
} else {
|
||||||
@ -177,8 +188,8 @@ public class Level5 {
|
|||||||
byte[] savedBssSection = new byte[bssSectionSize];
|
byte[] savedBssSection = new byte[bssSectionSize];
|
||||||
int savedDataCounter = dataCounter;
|
int savedDataCounter = dataCounter;
|
||||||
int savedBssCounter = bssCounter;
|
int savedBssCounter = bssCounter;
|
||||||
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, savedDataSection);
|
getMemory(relDataSectionAddr, dataSectionSize, savedDataSection);
|
||||||
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, savedBssSection);
|
getMemory(relBssSectionAddr, bssSectionSize, savedBssSection);
|
||||||
|
|
||||||
System.out.println("Increasing counters 3 times");
|
System.out.println("Increasing counters 3 times");
|
||||||
doCount(); javaDataCounter++; javaBssCounter++;
|
doCount(); javaDataCounter++; javaBssCounter++;
|
||||||
@ -186,13 +197,18 @@ public class Level5 {
|
|||||||
doCount(); javaDataCounter++; javaBssCounter++;
|
doCount(); javaDataCounter++; javaBssCounter++;
|
||||||
|
|
||||||
System.out.print("Checking increased values: ");
|
System.out.print("Checking increased values: ");
|
||||||
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
|
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
|
||||||
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
|
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
|
||||||
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
||||||
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
||||||
dataCounter = memory.getIntValueOf("initialized_counter");
|
dataCounter = memory.getIntValueOf("initialized_counter");
|
||||||
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
||||||
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
|
if (dataCounter != javaDataCounter) {
|
||||||
|
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
|
||||||
|
System.out.println("FAILED!");
|
||||||
|
System.exit(1);
|
||||||
|
} else if (bssCounter != javaBssCounter) {
|
||||||
|
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
|
||||||
System.out.println("FAILED!");
|
System.out.println("FAILED!");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
} else {
|
} else {
|
||||||
@ -200,7 +216,7 @@ public class Level5 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Restoring data segment");
|
System.out.println("Restoring data segment");
|
||||||
setMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, savedDataSection);
|
setMemory(relDataSectionAddr, dataSectionSize, savedDataSection);
|
||||||
javaDataCounter = savedDataCounter;
|
javaDataCounter = savedDataCounter;
|
||||||
|
|
||||||
System.out.println("Increasing counters 3 times");
|
System.out.println("Increasing counters 3 times");
|
||||||
@ -209,13 +225,18 @@ public class Level5 {
|
|||||||
doCount(); javaDataCounter++; javaBssCounter++;
|
doCount(); javaDataCounter++; javaBssCounter++;
|
||||||
|
|
||||||
System.out.print("Checking reset data counter: ");
|
System.out.print("Checking reset data counter: ");
|
||||||
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
|
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
|
||||||
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
|
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
|
||||||
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
||||||
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
||||||
dataCounter = memory.getIntValueOf("initialized_counter");
|
dataCounter = memory.getIntValueOf("initialized_counter");
|
||||||
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
||||||
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
|
if (dataCounter != javaDataCounter) {
|
||||||
|
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
|
||||||
|
System.out.println("FAILED!");
|
||||||
|
System.exit(1);
|
||||||
|
} else if (bssCounter != javaBssCounter) {
|
||||||
|
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
|
||||||
System.out.println("FAILED!");
|
System.out.println("FAILED!");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
} else {
|
} else {
|
||||||
@ -223,17 +244,22 @@ public class Level5 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Restoring bss segment");
|
System.out.println("Restoring bss segment");
|
||||||
setMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, savedBssSection);
|
setMemory(relBssSectionAddr, bssSectionSize, savedBssSection);
|
||||||
javaBssCounter = savedBssCounter;
|
javaBssCounter = savedBssCounter;
|
||||||
|
|
||||||
System.out.print("Checking reset bss counter: ");
|
System.out.print("Checking reset bss counter: ");
|
||||||
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
|
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
|
||||||
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
|
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
|
||||||
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
|
||||||
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
|
||||||
dataCounter = memory.getIntValueOf("initialized_counter");
|
dataCounter = memory.getIntValueOf("initialized_counter");
|
||||||
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
bssCounter = memory.getIntValueOf("uninitialized_counter");
|
||||||
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
|
if (dataCounter != javaDataCounter) {
|
||||||
|
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
|
||||||
|
System.out.println("FAILED!");
|
||||||
|
System.exit(1);
|
||||||
|
} else if (bssCounter != javaBssCounter) {
|
||||||
|
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
|
||||||
System.out.println("FAILED!");
|
System.out.println("FAILED!");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -26,17 +26,29 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: level5.c,v 1.3 2007/09/10 14:07:12 fros4943 Exp $
|
* $Id: level5.c,v 1.4 2008/11/20 16:22:28 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
int ref_var;
|
long ref_var; /* Placed somewhere in the BSS section */
|
||||||
|
|
||||||
int initialized_counter=1;
|
int initialized_counter=1; /* Variable in data section */
|
||||||
int uninitialized_counter;
|
int uninitialized_counter; /* Variable in BSS section */
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_Level5_setReferenceAddress(JNIEnv *env, jobject obj, jint addr)
|
||||||
|
{
|
||||||
|
/*printf("relative reference address is %p\n", addr);*/
|
||||||
|
/*printf("absolute reference address is %p\n", &ref_var);*/
|
||||||
|
|
||||||
|
ref_var = (((long)&ref_var) - ((long)addr));
|
||||||
|
printf("Offset is 0x%p\n", ref_var);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_Level5_doCount(JNIEnv *env, jobject obj)
|
Java_Level5_doCount(JNIEnv *env, jobject obj)
|
||||||
@ -44,22 +56,26 @@ Java_Level5_doCount(JNIEnv *env, jobject obj)
|
|||||||
printf(">> DATA_counter=\t%i\tBSS_counter=\t%i\n", ++initialized_counter, ++uninitialized_counter);
|
printf(">> DATA_counter=\t%i\tBSS_counter=\t%i\n", ++initialized_counter, ++uninitialized_counter);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
JNIEXPORT jint JNICALL
|
|
||||||
Java_Level5_getRefAddress(JNIEnv *env, jobject obj)
|
JNIEXPORT void JNICALL
|
||||||
|
Java_Level5_getMemory(JNIEnv *env, jobject obj, jint rel_addr, jint length, jbyteArray mem_arr)
|
||||||
{
|
{
|
||||||
return (jint) &ref_var;
|
(*env)->SetByteArrayRegion(
|
||||||
|
env,
|
||||||
|
mem_arr,
|
||||||
|
0,
|
||||||
|
(size_t) length,
|
||||||
|
(jbyte *) (((long)rel_addr) + ref_var)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_Level5_getMemory(JNIEnv *env, jobject obj, jint start, jint length, jbyteArray mem_arr)
|
Java_Level5_setMemory(JNIEnv *env, jobject obj, jint rel_addr, jint length, jbyteArray mem_arr)
|
||||||
{
|
|
||||||
(*env)->SetByteArrayRegion(env, mem_arr, 0, (size_t) length, (jbyte *) start);
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_Level5_setMemory(JNIEnv *env, jobject obj, jint start, jint length, jbyteArray mem_arr)
|
|
||||||
{
|
{
|
||||||
jbyte *mem = (*env)->GetByteArrayElements(env, mem_arr, 0);
|
jbyte *mem = (*env)->GetByteArrayElements(env, mem_arr, 0);
|
||||||
memcpy((void *) start, mem, length);
|
memcpy(
|
||||||
|
(char*) (((long)rel_addr) + ref_var),
|
||||||
|
mem,
|
||||||
|
length);
|
||||||
(*env)->ReleaseByteArrayElements(env, mem_arr, mem, 0);
|
(*env)->ReleaseByteArrayElements(env, mem_arr, mem, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user