【问题标题】:How to create a new Java object with new scope in JNI如何在 JNI 中创建具有新范围的新 Java 对象
【发布时间】:2017-06-01 09:21:12
【问题描述】:

我在下面的例子中试过。我有两个本地方法 setMessage 和 printMessage。我在 main 方法中创建了两个 ClassA 对象,并在 a1 对象上创建了 setMessage 我也在 a2 对象上获得了相同的消息范围(见输出)。

如何创建具有新作用域的新 ClassA 对象。

ClassA.c

#include "ClassA.h"

char * message ;
JNIEXPORT void JNICALL Java_ClassA_setMessage (JNIEnv * env , jobject obj, jstring msg){
    message = (*env)->GetStringUTFChars(env, msg, 0);  
}

JNIEXPORT void JNICALL Java_ClassA_printMessage  (JNIEnv * env, jobject obj){
  printf("%s\n", message);
}

ClassA.java

public class ClassA { 
    static {
         System.loadLibrary("myapp");          
    }
    public native void setMessage(String msg);
    public native void printMessage();
}

ClassB.java

public class ClassB   { 
    public static void main(String[] args) {
        ClassA a1 = new ClassA();
        System.out.print("Print message with out setMessage() By a1 :");
        a1.printMessage();
        a1.setMessage("I am a1"); 
        System.out.print("Print message after setMessage() By a1 : ");
        a1.printMessage();


        ClassA a2 = new ClassA(); 
        System.out.print("Print message with out setMessage() By a2 :");
        a2.printMessage(); 


    a2.setMessage("I am a2");   
    System.out.print("Print message after setMessage() By a2  :  ");
    a2.printMessage();
    }
}

:::: 输出 ::::

  Print message with out setMessage() By a1 : (null)
  Print message after setMessage() By a1    :  I am a1
  Print message with out setMessage() By a2 :  I am a1
  Print message after setMessage() By a2    :  I am a2

【问题讨论】:

    标签: java c class scope java-native-interface


    【解决方案1】:

    在创建新对象之前清除“消息”。

    【讨论】:

    • 但我需要具有新范围的新对象。我想同时使用两个对象。
    • 然后把这个静态的static { System.loadLibrary("myapp"); }去掉,改成Runtime.getRuntime().loadLibrary("myapp");
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多