2013-09-26 81 views
0

我的目標是構建一個Java類實現從C++調用的方法。此方法在同一個類中獲得另一個Java-Method的名稱。通過java-reflection API我想獲得對它的引用(稍後調用它)。通過JNI/C++調用時未找到Java方法

但是從C++調用的方法沒有找到其他的Java方法。如果它從java運行它工作正常。我錯過了什麼?

JAVA:

public void myCPlusPlusFunc(String method){ // I'll pass "noparam" in here 
    logMessage("Searching for method " + method + "...."); 
    for (Method m : this.getClass().getMethods()) { 
     if (method == m.getName()) { 
      logMessage("Found it!"); // never found when called through JNI/C++ 
      // (...) invoke the method etc... 
     } 
    } 
} 

public void noparam() { 
    logMessage("noparam got called"); 
} 

C++

JNIEnv *env = theJVMLoader->getENV(); 
jmethodID m = env->GetMethodID(getBeanClass(), "myCPlusPlusFunc", "(Ljava/lang/String;)V"); 
if (env->ExceptionCheck()) {  
    handleException(); 
    ASSERT(FALSE); 
    return FALSE; 
} 
ASSERT(m); 
if (m) 
{ 
    // "noparam" is the method i expect to find 
    jstring s = env->NewStringUTF("noparam"); 
    env->CallVoidMethod(getBeanInstance(), m, s); 
} 
+1

也許有一個與你的方法有問題== m.getName()時,它從JNI調用。你應該在那裏嘗試m.getName()。equals(method)。我不知道如果從jni傳遞的字符串也可以與== –

+0

進行比較,請從您的評論中回答問題! – Jakob

回答

2

林不知道,如果你可以從JNI與平等==操作符比較字符串。取而代之的

if (method == m.getName()) 

你應該嘗試

if (m.getName().equals(method)) 

+0

哇!這是一個相當耗時的'=='.... thx很多你的幫助! – Jakob

+0

除非兩者都被禁用,否則您不能將字符串與'=='進行比較。例如,'new String(「foo」)== new String(「foo」)'將返回false。 –