-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から来ている」として適切に設定されている誰かが親切に私を助けることはできますか?
ありがとうございました。
クラスがCLASSPATH上に見つかりませんでした。だからそれを修正してください。エラー処理が正しくありません。エラーが発生した場合は、ログに記録し、それが起こらなかったかのように続行します。あなたはおそらくそれを取り除くことを望むことはできません。 – EJP
ネイティブコードはどのように呼び出されますか?たぶん** Session **クラスはその時までにロードされていないかもしれません。 ** Sessionへの呼び出しを追加してみてください。 checkExpiry( "dummy")**をネイティブlibをロードする前にJavaコードに追加します。 –