2016-07-13 27 views
0

ネイティブコード からjavaメソッドを呼び出す簡単な例をビルドしましたが、コンストラクタが呼び出されないオブジェクトがいくつかあります。android jni - NewObject関数はコンストラクタを呼び出しませんか?

私のJavaクラス:

public class MyJavaNumber 
{ 
    private int num; 

    public MyJavaNumber() 
    { 
     num = 7; 
     Log.d("MyJavaNumber" , "con"); 
    } 

    public int getNum() { 
     Log.d("getNum" , "num = " + num); 
     return num; 
    } 
} 

CPPコード:

extern "C" 
{ 
JNIEXPORT jint JNICALL 
     Java_nativeex_com_example_nativeex_MainActivity_getIntA(JNIEnv *env, jobject obj); 
}; 

JNIEXPORT jint JNICALL 
     Java_nativeex_com_example_nativeex_MainActivity_getIntA(JNIEnv *env, jobject obj) 
{ 
    jclass localClass = env->FindClass("nativeex/com/example/nativeex/MyJavaNumber"); 
    javaClassRef = (jclass) env->NewGlobalRef(localClass); 
    javaMethodRef = env->GetMethodID(javaClassRef, "getNum", "()I"); 
    jobject javaObjectRef = env->NewObject(javaClassRef, javaMethodRef); 
    return env->CallIntMethod(javaObjectRef, javaMethodRef); 
} 

MainActivity:

public class MainActivity extends AppCompatActivity { 

public native int getIntA(); 


static 
{ 
    System.loadLibrary("ndktest"); 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Log.d("onCreate", "" + getIntA()); 


} 

}

ログ出力は次のようになります。

07-13 14:00:01.049 6797-6797/nativeex.com.example.nativeex D/getNum: num = 0 
07-13 14:00:01.049 6797-6797/nativeex.com.example.nativeex D/getNum: num = 0 
07-13 14:00:01.049 6797-6797/nativeex.com.example.nativeex D/onCreate: 0 

オブジェクトのmethosを呼び出すことはできますが、コンストラクタは呼び出されません。

答えて

2
javaMethodRef = env->GetMethodID(javaClassRef, "getNum", "()I"); 
jobject javaObjectRef = env->NewObject(javaClassRef, javaMethodRef); 

javaMethodRefが許容できないで、specNewObjectについてこう述べています。

は、新しいJavaオブジェクトを構築します。メソッドIDは、どの コンストラクターメソッドを呼び出すかを示します。このIDは、 メソッド名として<init>でGetMethodID()を呼び出し、 戻り値の型としてvoidV)を呼び出すことで取得する必要があります。このparamはMyJavaNumberのbojectある方法でJava_nativeex_com_example_nativeex_MainActivity_getIntA(JNIEnvの* envを、jオブジェクトOBJ) をPARAM "OBJ" を使用する

0

試してみます。コンストラクタが呼び出されたときに私にも混乱します。

関連する問題