android c 调用 java,Android:从C ++ Native Activity调用Java类

Java code:

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 source:

...

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);

...

it fails with:

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)

Any hint what I'm doing wrong, please?

解决方案

Don't mess with java class loader. Use this code:

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值