2014-05-15 29 views
0

我需要調用java方法。在NDK中調用java代碼不起作用

Projekt.cpp: 
jclass cls = env->GetObjectClass(obj); 
jmethodID mid = env->GetMethodID(cls, "Vypocet", "(III)I"); 
int vysledek = env->CallIntMethod(cls, mid, nahodne_cislo, d, n); 


Main.java 
public Integer Vypocet(int a, int b, int c) 
    { 
...........other code...... 
........................... 
     return vysl; 
    } 

我不知道現在怎麼辦? :(

logcat的寫錯誤Fatal signal 11 (SIGSEGV) at 0xdeadd00d

回答

1

在Java代碼中,你聲明一個返回類型Integer(這是一類,與全名java.lang.Integer中)的方法

但隨後在你的C++代碼,你看看與簽名(III)I的方法,這意味着3個int參數和返回一個int值。事後你使用CallIntMethod也希望返回一個int返回類型的方法。

您可以通過更改您的Java代碼來解決問題:

public int Vypocet(int a, int b, int c) { 
    // your code 
    return vysl; 
} 

另一種解決辦法是改變你的C++代碼,以反映Integer返回類型,對這樣的事情:

// call your java method 
jclass cls = env->GetObjectClass(obj); 
jmethodID mid = env->GetMethodID(cls, "Vypocet", "(III)Ljava/lang/Integer;"); 
jobject intObj = env->CallIntMethod(cls, mid, nahodne_cislo, d, n); 

// call the Integer.getValue() to get a native int value 
jclass integercls = env->GetObjectClass(intObj); 
jmethodID getVal = env->GetMethodID(cls, "intValue", "()I"); 
int value = jenv->CallIntMethod(integervalue, getVal); 
+0

第一個建議是否意味着「public * int * Vypocet」? – fadden

+0

我的不好,沒有複製正確的代碼行 – XGouchet