Вопрос по c, java – Android: вызов Java-класса из C ++ Native Activity

0

Java-код:

    package local.ttt;

    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Typeface;

    public class Text2Bitmap {
        static Bitmap getBitmap(String text,int fontsize) {
            Paint paint=new Paint();
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.WHITE);
            paint.setTextSize(fontsize);
            paint.setAntiAlias(true);
            paint.setTypeface(Typeface.DEFAULT);

            int outwidth=(int)Math.round(paint.measureText(text));
            Bitmap bitmap=Bitmap.createBitmap(outwidth,fontsize,Bitmap.Config.ALPHA_8);

            Canvas canvas=new Canvas(bitmap);
            canvas.drawText(text,0,fontsize-1,paint);

            return bitmap;
        }
    }

C источник:


            ...
            MY_ASSERT(vm_cached!=NULL);
            JNIEnv* env;
            jint res=vm_cached->AttachCurrentThread(&env,NULL);
            MY_ASSERT(res==0);
            jclass activityClass=env->FindClass("android/app/NativeActivity");
            MY_ASSERT(activityClass!=NULL);
            jmethodID getClassLoader=env->GetMethodID(activityClass,"getClassLoader","()Ljava/lang/ClassLoader;");
            MY_ASSERT(getClassLoader!=NULL);
            MY_ASSERT(nativeActivityObjHnd!=NULL);
            jobject cls=env->CallObjectMethod(nativeActivityObjHnd,getClassLoader);
            jclass classLoader=env->FindClass("java/lang/ClassLoader");
            MY_ASSERT(classLoader!=NULL);
            jmethodID findClass=env->GetMethodID(classLoader,"loadClass","(Ljava/lang/String;)Ljava/lang/Class;");
            MY_ASSERT(findClass!=NULL);
            jstring strClassName=env->NewStringUTF("Llocal/ttt/Text2Bitmap;");
            jclass text2bitmapClass=(jclass)env->CallObjectMethod(cls,findClass,strClassName); //fails here
            MY_ASSERT(text2bitmapClass!=NULL);
            res=vm_cached->DetachCurrentThread();
            MY_ASSERT(res==0);
            ...

это терпит неудачу с:

W/dalvikvm(5614): dvmFindClassByName rejecting 'Llocal/ttt/Text2Bitmap;'
W/dalvikvm(5614): threadid=9: thread exiting with uncaught exception (group=0x4002d560)
E/AndroidRuntime(5614): FATAL EXCEPTION: Thread-10
E/AndroidRuntime(5614): java.lang.ClassNotFoundException: Llocal/ttt/Text2Bitmap; in loader dalvik.system.PathClassLoader[.]
E/AndroidRuntime(5614):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E/AndroidRuntime(5614):     at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E/AndroidRuntime(5614):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(5614):     at dalvik.system.NativeStart.run(Native Method)

Любой намек на то, что я делаю неправильно, пожалуйста?

Попробуйте удалить точку с запятой? sarnold
Этот вопрос - кошмар, но я все равно попробовал. Вам необходимо определить, какая строка нативного кода вызывает ошибку (поскольку у нас нет номеров строк). Youssef G.
это приводит к ошибке «здесь не удается» в коде c. NoAngel
я не могу использовать отладку в моем окружении. Я тестирую на устройстве, я не могу получить root права. поэтому отладка здесь не работает. вопрос про c часть, а не java. NoAngel
Вы пробовали отладку? Дампы кода здесь не совсем кошерные simchona

Ваш Ответ

2   ответа
1

что является причиной вашей ошибки (вы не указываете, где находятся строки или конкретная строка, в которой вы испытываете затруднения при отладке), но я укажу несколько быстрых ошибок, которые я вижу.

Одна первая ошибка - вам нужно использоватьCallStaticObjectMethod так как вы вызываете статический метод. Вашjmethodid findClass имеет methodID, а не класс, что вводит в заблуждение и неправильно. У вас также есть два параметра, но вы, кажется, передаете только один параметр.

В основном вам нужно:

(env)->GetStaticMethodID(jclass,"method name", "Parameter list")

--jclass является ссылкой на класс - «имя метода» это имя метода в кавычках - & quot; Список параметров & quot; это список параметров, который вам нужен для поиска синтаксиса.

Пропустив несколько вещей ... Чтобы назвать свои вещи, вам нужно:

(env)->CallStaticObjectMethod(jclass,jmid,parameter1,parameter2)

--jclass снова является классом, который имеет статический метод. --jmid - это идентификатор метода java, который вы получаете из функции выше. --parameter1 и parameter2 - параметры, необходимые для метода java.

Наконец, я думаю, что это может быть просто предпочтением, но я не буду присоединять поток к JVM, пока у вас не будет всей необходимой информации для перехода в JVM.

Error: User Rate Limit Exceededblog.tewdew.comError: User Rate Limit Exceeded NoAngel
Error: User Rate Limit Exceeded NoAngel
Error: User Rate Limit Exceeded NoAngel
Error: User Rate Limit Exceededjournals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/…
1

Не связывайтесь с загрузчиком классов Java. Используйте этот код:

MY_ASSERT(vm_cached!=NULL);

JNIEnv* env;
jint res = vm_cached->AttachCurrentThread(&env,NULL);
MY_ASSERT(res==0);

jclass t2bClass = env->FindClass("local/ttt/Text2Bitmap");
MY_ASSERT(t2bClass!=NULL);

jmethodID getBitmap = env->GetStaticMethodID(t2bClass, "getBitmap","(Ljava/lang/String;I)Landroid/graphics/Bitmap;");
MY_ASSERT(getBitmap!=NULL);

jstring text = ...;
int fontsize = ...;
jobject bitmap = env->CallStaticObjectMethod(t2bClass, getBitmap, text, fontsize);
MY_ASSERT(bitmap!=NULL);

// process bitmap here
// ...

res=vm_cached->DetachCurrentThread();
MY_ASSERT(res==0);
Error: User Rate Limit Exceeded NoAngel
Error: User Rate Limit Exceeded NoAngel
Error: User Rate Limit Exceeded NoAngel
Error: User Rate Limit Exceededgithub.com/fabiensanglard/Shmup/tree/master/engine/android
Error: User Rate Limit Exceededgithub.com/fabiensanglard/Shmup/blob/master/engine/android/jni/…Error: User Rate Limit Exceededandroid.wooyd.org/JNIExample/files/JNIExample.pdfError: User Rate Limit Exceeded NoAngel

Похожие вопросы