[英]Android ndk : Problem for call of Java method from c++ with jni
[英]JNI / Android : call to non static method in Java from C++?
我有以下JNI方法,它當前調用靜態Java方法:
void bindToMarketBillingServiceJNI(const char * inappID)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t
, "com/mycompany/games/js/TestsDemo"
, "bindToMarketBillingService"
, "(Ljava/lang/String;)V"))
{
jstring stringArg1;
if (! inappID)
{
stringArg1 = t.env->NewStringUTF("1");
}
else
{
stringArg1 = t.env->NewStringUTF(inappID);
}
t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1);
t.env->DeleteLocalRef(stringArg1);
t.env->DeleteLocalRef(t.classID);
}
}
這是我的Java方法:
public static void bindToMarketBillingService(final String mSku)
{
// Some code....
}
一切正常。
但是現在,我想讓我的Java方法成為NON STATIC。 我以為我只需改變:
但它崩潰了......(下面的崩潰日志)
有誰知道如何解決這個問題?
謝謝 !!
08-20 11:54:11.009: A/libc(9379): Fatal signal 11 (SIGSEGV) at 0x0c1f4072 (code=1)
08-20 11:54:11.109: D/dalvikvm(31592): GC_CONCURRENT freed 735K, 12% free 9743K/10951K, paused 4ms+7ms
08-20 11:54:11.184: D/dalvikvm(1976): GC_CONCURRENT freed 1720K, 35% free 28243K/43399K, paused 5ms+13ms
08-20 11:54:11.194: I/ApplicationPolicy(1976): getActualApplicationStateEnabled() : true
08-20 11:54:11.219: D/PJ_MainApplication(9698): onApplicationCreate -> Now
08-20 11:54:11.334: D/dalvikvm(31592): GC_CONCURRENT freed 273K, 9% free 9981K/10951K, paused 3ms+3ms
08-20 11:54:11.409: D/PJ_CrashManager(9698): registerHandler -> Current handler class = com.android.internal.os.RuntimeInit$UncaughtHandler
08-20 11:54:11.469: I/DEBUG(9331): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
08-20 11:54:11.469: I/DEBUG(9331): Build fingerprint: 'samsung/GT-I9100/GT-I9100:4.0.3/IML74K/XWLPG:user/release-keys'
08-20 11:54:11.469: I/DEBUG(9331): pid: 9379, tid: 9403 >>> com.audioguidia.games.js <<<
08-20 11:54:11.469: I/DEBUG(9331): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0c1f4072
08-20 11:54:11.474: I/DEBUG(9331): r0 00000000 r1 10000000 r2 fffffffc r3 4cbb9ef0
08-20 11:54:11.474: I/DEBUG(9331): r4 00273f98 r5 4c7f7fc4 r6 51134ad4 r7 415077f8
08-20 11:54:11.474: I/DEBUG(9331): r8 00000001 r9 0c1f4071 10 4cbb9ee4 fp 51134a58
08-20 11:54:11.474: I/DEBUG(9331): ip ffffffec sp 51134a58 lr 4096864d pc 40968aac cpsr 00000030
08-20 11:54:11.474: I/DEBUG(9331): d0 0000000000000000 d1 3f80000000000000
08-20 11:54:11.474: I/DEBUG(9331): d2 0000000000000000 d3 0000000000000000
08-20 11:54:11.474: I/DEBUG(9331): d4 0000000000000000 d5 3f80000000000000
etc....
僅更改env
對象上的調用是不夠的。
首先,您的新實例方法應該在Java類中聲明,如: public void myMethod(...)
(即此處沒有static
關鍵字)。
其次,您需要一個java對象引用來調用實例方法,而不僅僅是類。 即你會做類似的事情(請注意我使用的是C語法):
jmethodID midCallBack = (*env)->GetMethodID(env, thisClass, "myMethod", "()V");
if (NULL == midCallBack) return;
// Call back the method (which returns void), based on the Method ID
(*env)->CallVoidMethod(env, thisObj, midCallBack);
有關詳細信息,請參閱此鏈接中的 “5.3回調實例方法和靜態方法”部分
如果要調用非靜態方法,則必須創建該類的對象,然后才調用成員方法。 代碼看起來像這樣
jmethodID constructor = env->GetMethodID(cls, "<init>", "()V"); //this is for defaul c-tor
jobject object = env->NewObject(cls, constructor);
//getting your method id
env->CallVoidMethod(object, methodId/*,your parameters*/);
我剛剛在java中創建了一個靜態方法,它調用非靜態方法:
static public void startActivity() {
try {
Activity mother = QtNative.activity();
Intent intent = new Intent(mother, MainActivity.class);
mother.startActivity(intent);
} catch (Exception e) {
Log.e(msgTag, e.toString());
e.printStackTrace();
}
}
我從C ++那里打來電話:
void FacebookAndroid::startAndroidFacebook() {
QAndroidJniObject::callStaticMethod<void>("org.qtproject.example.MainActivity",
"startFacebookActivity",
"()V");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.