0

ネイティブ コードから Java メソッドを呼び出す簡単な例を作成しました。いくつかのオブジェクトの Java メソッドを呼び出していますが、コンストラクターは呼び出されません。

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

主な活動 :

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

オブジェクトのメソッドを呼び出しているのに、コンストラクターが呼び出されないのはどうしてですか?

4

2 に答える 2

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

javaMethodRef容認できない、仕様は次のように述べていNewObjectます:

新しい Java オブジェクトを構築します。メソッド ID は、呼び出すコンストラクター メソッドを示します。<init>この ID は、メソッド名として GetMethodID() を呼び出し、void( V) を戻り値の型として取得する必要があります。

于 2016-07-13T11:21:40.810 に答える
0

メソッド Java_nativeex_com_example_nativeex_MainActivity_getIntA(JNIEnv *env, jobject obj) でパラメーター「obj」を使用してみてください。このパラメーターは MyJavaNumber の boject です。コンストラクターが呼び出されたときにも混乱します。

于 2016-07-13T11:30:00.277 に答える