2017-01-17 9 views
3

以下の例を試してみました。私は2つのネイティブメソッドsetMessageとprintMessageを持っています。私は、mainメソッドで2つのClassAオブジェクトを作成しています.a1オブジェクトのsetMessageは、a2オブジェクトでも同じメッセージスコープを取得します(出力を参照)。JNIで新しいスコープで新しいJavaオブジェクトを作成する方法

新しいスコープで新しい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 

答えて

1

新しいオブジェクトを作成する前に「メッセージ」をクリアします。

+0

しかし、新しい範囲で新しいオブジェクトが必要です。私は同時に2つのオブジェクトを使いたい。 –

+0

次に、この静的を削除します。 'static { System.loadLibrary(" myapp "); } ' のように変更し、 Runtime.getRuntime()。loadLibrary(" myapp ");'のように変更します。 – bala

関連する問題