I was trying to use the native
keyword to call a C++ function in Java.
But when I started the JVM, the console showed an error.
Output:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb7fd9f73d, pid=11040, tid=9696
#
# JRE version: Java(TM) SE Runtime Environment 18.9 (11.0.7+8) (build 11.0.7+8-LTS)
# Java VM: Java HotSpot(TM) 64-Bit Server VM 18.9 (11.0.7+8-LTS, mixed mode, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# V [jvm.dll+0x55f73d]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\自创java小程序\JavaPointer\bin\hs_err_pid11040.log
#
# If you would like to submit a bug report, please visit:
# https://bugreport.java.com/bugreport/crash.jsp
#
Java code:
package awa.pointer;
import java.lang.annotation.*;
public class Pointer<T> {
static{
System.setProperty("java.library.path", "./");
System.loadLibrary("JavaPointer");
}
@Native
private int address;
public native T get();
public native boolean set(T v);
public native void moveTo(int a);
public native void move(int a);
public native static int addr(Object v);
public Pointer(int addr) {
this.address=addr;
}
public Pointer() {
this(0);
}
public static void main(String[] args) {
Integer i=0;
Pointer<Integer> p=new Pointer<>(Pointer.addr(i));
System.out.println(p.get());
}
}
C++ code:
awa_pointer_Pointer.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class awa_pointer_Pointer */
#ifndef _Included_awa_pointer_Pointer
#define _Included_awa_pointer_Pointer
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: awa_pointer_Pointer
* Method: get
* Signature: ()Ljava/lang/Object;
*/
JNIEXPORT jobject& JNICALL Java_awa_pointer_Pointer_get
(JNIEnv *, jobject);
/*
* Class: awa_pointer_Pointer
* Method: set
* Signature: (Ljava/lang/Object;)Z
*/
JNIEXPORT jboolean JNICALL Java_awa_pointer_Pointer_set
(JNIEnv *, jobject, jobject);
/*
* Class: awa_pointer_Pointer
* Method: moveTo
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_awa_pointer_Pointer_moveTo
(JNIEnv *, jobject, jint);
/*
* Class: awa_pointer_Pointer
* Method: move
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_awa_pointer_Pointer_move
(JNIEnv *, jobject, jint);
/*
* Class: awa_pointer_Pointer
* Method: addr
* Signature: (Ljava/lang/Object;)I
*/
JNIEXPORT jint JNICALL Java_awa_pointer_Pointer_addr
(JNIEnv *, jclass, jobject&);
#ifdef __cplusplus
}
#endif
#endif
awa_pointer_Pointer.cpp:
#include <exception>
#include <cstdint>
#include "awa_pointer_Pointer.h"
using namespace std;
JNIEXPORT jobject& JNICALL Java_awa_pointer_Pointer_get(JNIEnv* env, jobject jobj){
jobject* ptr=(jobject*)(env->GetObjectField(jobj, env->GetFieldID(env->GetObjectClass(jobj), "address", "I")));
return *ptr;
};
JNIEXPORT jboolean JNICALL Java_awa_pointer_Pointer_set(JNIEnv* env, jobject jobj, jobject v){
jobject* ptr=(jobject*)(env->GetObjectField(jobj, env->GetFieldID(env->GetObjectClass(jobj), "address", "I")));
try{
*ptr=v;
}catch(exception e){
return jboolean(false);
}
return jboolean(true);
};
JNIEXPORT void JNICALL Java_awa_pointer_Pointer_moveTo(JNIEnv* env, jobject jobj, jint addr){
env->SetObjectField(jobj,env->GetFieldID(env->GetObjectClass(jobj), "address", "I")
, jobject(&addr));
};
JNIEXPORT void JNICALL Java_awa_pointer_Pointer_move(JNIEnv* env, jobject jobj, jint a){
env->SetObjectField(jobj,env->GetFieldID(env->GetObjectClass(jobj), "address", "I"), env->GetObjectField(jobj, env->GetFieldID(env->GetObjectClass(jobj), "address", "I"))+a);
};
JNIEXPORT jint JNICALL Java_awa_pointer_Pointer_addr(JNIEnv* env, jclass jclass, jobject& obj){
return intptr_t(&obj);
};
User contributions licensed under CC BY-SA 3.0