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
しかし、新しい範囲で新しいオブジェクトが必要です。私は同時に2つのオブジェクトを使いたい。 –
次に、この静的を削除します。 'static { System.loadLibrary(" myapp "); } ' のように変更し、 Runtime.getRuntime()。loadLibrary(" myapp ");'のように変更します。 – bala