【发布时间】:2012-04-28 09:31:36
【问题描述】:
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 拒绝 'Llocal/ttt/Text2Bitmap;' W/dalvikvm(5614): threadid=9: 线程以未捕获的异常退出 (group=0x4002d560) E/AndroidRuntime(5614):致命异常:线程 10 E/AndroidRuntime(5614): java.lang.ClassNotFoundException: Llocal/ttt/Text2Bitmap;在加载器 dalvik.system.PathClassLoader[.] E/AndroidRuntime(5614):在 dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) E/AndroidRuntime(5614): 在 java.lang.ClassLoader.loadClass(ClassLoader.java:551) E/AndroidRuntime(5614):在 java.lang.ClassLoader.loadClass(ClassLoader.java:511) E/AndroidRuntime(5614): 在 dalvik.system.NativeStart.run(Native Method)请提示我做错了什么?
【问题讨论】:
-
你试过调试吗?代码转储在这里并不是真正的洁净
-
这个问题是一场噩梦,但我还是尝试了一下。您需要确定是哪一行本机代码导致了错误(因为我们没有行号)。
-
我不能在我的环境中使用调试。我在无法root的设备上进行测试。所以调试在这里不起作用。问题是关于 c 部分,而不是 java。
-
它在 c 代码中导致“此处失败”错误。
-
看看我的回答,试试我的一些建议。
标签: java c android-ndk native-activity