Crash when casting Java object to native pointer and back

0

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);
    };


java
c++
java-native-interface
asked on Stack Overflow Jul 4, 2020 by Java_Herobrine • edited Jul 11, 2020 by Awaaaaawwwwa

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0