2017-06-30 12 views
-1

Native C++のAndroidコードから呼び出す静的なJava関数があります。AndroidネイティブのC++コードから静的なJavaメソッドを呼び出す

Javaメソッド:

package com.verizon.freebeesdk; 

public class Session { 
    public static void checkExpiry(String s){ 

     Log.d("CALLED FROM JNI",s); 

    } 
} 

C++コード:

static JNIEnv* __getEnv(bool* attached) 
{ 
JNIEnv* env = NULL; 
*attached = false; 
int ret = __java_vm->GetEnv((void**)&env, JNI_VERSION_1_4); 
if (ret == JNI_EDETACHED) { 
    if (0 != __java_vm->AttachCurrentThread(&env, NULL)) { 
     return NULL; 
    } 
    *attached = true; 
    return env; 
} 

if (ret != JNI_OK) { 
    return NULL; 
} 

return env; 
} 

void __check_expiry(){ 

JNIEnv* env = NULL; 
static bool __is_attached_1 = false; 

if ((env = __getEnv(&__is_attached_1)) == NULL) { 
    log_info("getEnv fail\r\n"); 
} 
assert(!__is_attached_1); 

jstring jstr = env->NewStringUTF("This string comes from JNI"); 
log_info("CHECK EXPIRY: %s ",env->GetStringUTFChars(jstr ,0)); 

jclass clazz = env->FindClass("com/verizon/freebeesdk/Session"); 
if(clazz == 0){ 
    log_info("This class not found"); 
} 
jmethodID mid = env->GetStaticMethodID(clazz, "checkExpiry", "(Ljava/lang/String;)V"); 
env->CallStaticVoidMethod(clazz, mid, jstr); 
} 

出力:

私は常に文の "このクラスが見つからない" と、その後のエラーが表示されます。

java.lang.NoClassDefFoundError:ブートクラスローダを使用してクラスが見つかりませんでした。可能なスタックトレースを持たない

JNIEnvのが適切に最初のログステートメントプリント「EXPIRYを確認してください。この文字列は、JNIから来ている」として適切に設定されている

誰かが親切に私を助けることはできますか?

ありがとうございました。

+0

クラスがCLASSPATH上に見つかりませんでした。だからそれを修正してください。エラー処理が正しくありません。エラーが発生した場合は、ログに記録し、それが起こらなかったかのように続行します。あなたはおそらくそれを取り除くことを望むことはできません。 – EJP

+0

ネイティブコードはどのように呼び出されますか?たぶん** Session **クラスはその時までにロードされていないかもしれません。 ** Sessionへの呼び出しを追加してみてください。 checkExpiry( "dummy")**をネイティブlibをロードする前にJavaコードに追加します。 –

答えて

0

まず、あなたの問題(少なくともあなたが今直面している問題)は静的関数を呼び出すことではなく、Sessionクラスを見つけることであるため、タイトルは正確ではありません。

クラスを取得するためのコードが右のようだが、このようなクラスローダの問題としてクラスを見つけることができない他の理由、があるかもしれない - その上のJNIのドキュメントを見て、それが助けかどうかを確認:FAQ: Why didn't FindClass find my class?

関連する問題