Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:从C++;本地活动_Java_C_Android Ndk_Native Activity - Fatal编程技术网

Java Android:从C++;本地活动

Java Android:从C++;本地活动,java,c,android-ndk,native-activity,Java,C,Android Ndk,Native Activity,Java代码: package local.ttt; 导入android.graphics.Bitmap; 导入android.graphics.Canvas; 导入android.graphics.Color; 导入android.graphics.Paint; 导入android.graphics.Typeface; 公共类Text2Bitmap{ 静态位图getBitmap(字符串文本,int-fontsize){ 油漆=新油漆(); 绘制.设置样式(绘制.样式.填充); 油漆。设置颜色(

Java代码:

package local.ttt;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Typeface;
公共类Text2Bitmap{
静态位图getBitmap(字符串文本,int-fontsize){
油漆=新油漆();
绘制.设置样式(绘制.样式.填充);
油漆。设置颜色(颜色。白色);
油漆。setTextSize(fontsize);
paint.setAntiAlias(真);
paint.setTypeface(Typeface.DEFAULT);
int outwidth=(int)Math.round(paint.measureText(text));
Bitmap Bitmap=Bitmap.createBitmap(外径、字体大小、位图.Config.ALPHA_8);
画布=新画布(位图);
画布.drawText(文本,0,字体大小-1,绘制);
返回位图;
}
}
C资料来源:

它失败于:

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) W/dalvikvm(5614):dvmFindClassByName拒绝'Llocal/ttt/Text2Bitmap;' W/dalvikvm(5614):threadid=9:线程退出时出现未捕获异常(组=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(本机方法)
请给出我做错了什么的任何提示?

不确定是什么导致了错误(您没有指出行的位置,或者您调试困难的特定行),但我将继续指出我看到的一些快速错误

第一个错误是您需要使用
CallStaticObjectMethod
,因为您正在调用一个静态方法。您的
jmethodid findClass
有一个methodID,而不是一个类,这是误导性的和错误的。您还有两个参数,但似乎只传递了一个参数

基本上,您需要:

(env)->GetStaticMethodID(jclass,“方法名”,“参数列表”)

--jclass是类引用 --“方法名称”是引号中的方法名称 --“参数列表”是参数列表,您需要查找语法

略过几件事…给你需要的东西打电话:

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

--jclass再次成为具有静态方法的类。 --jmid是从上述函数中获得的java方法id。 --parameter1和parameter2是java方法所需的参数


最后,我认为这可能只是一种偏好,但我不会将线程附加到JVM,除非您拥有跳转到JVM所需的所有信息

不要弄乱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);

你试过调试吗?代码转储并不是真正的犹太教。这个问题是一场噩梦,但我还是尝试了一下。您需要识别导致错误的本机代码行(因为我们没有行号)。我无法在我的AnEnvironment中使用调试。我无法在设备上测试根目录。所以调试在这里不起作用。问题是关于c部分,而不是java。它会导致c代码中的“fails here”出现错误。请参阅我的答案,尝试我的一些建议。谢谢您的回答!尝试使用“从本机活动使用jni”中的代码,目标只是将简单的java类添加到本机活动eclipse项目中,以便从文本字符串生成位图。我想用C++类来实现java。让我减轻你的痛苦,从开始做起。读一下JNI,我花了相当长的时间才让JNI在我的实现中工作,而对Java进行C调用并不是最容易理解的部分之一:谢谢!我“弄乱类加载器”的原因是,根据我在上面的博客和其他一些来源中读到的,当你使用本机活动时,你必须使用类加载器,或者“离开JNIEnv的FindClass不会让你满意。它找不到你的类。原因是因为JNIEnv FindClass的上下文没有意识到你的类的存在。”。就是这样,她说:)。我尝试了你的代码,但在我的断言(t2bClass!=NULL)中失败;也许我应该向androidmanifest.xml添加一些内容?嗯。现在它设置为本机活动,并且有android:hasCode=“false”。如果你没有代码,那么当然JNI找不到你的类,因为它们不在那里:)将hasCode更改为true。从NativeActivity开始,JNI应该可以很好地工作,它可以找到并使用您的类——实际上没有必要弄乱类加载器。下面是另一个如何使用NativeActivity中的Java代码的示例-注释#1是我的,它在作者代码中工作得很好:没有类加载器的findclass应该可以工作,但即使使用hascode=true也不适用于我。另外根据:“*JNI问题:*尝试从本机代码调用Java方法时出现新错误:NDK JNI错误:非VM线程进行JNI调用*当我们在游戏线程中接收到JNIEnv时,JNIEnv似乎不是真正有效的。我们需要将线程附加到VM(AttachCurrentThread)并创建一个新的JNIEnv***SNAAAP!!即使在附加并获得有效的JNIEnv之后,我们似乎仍然没有正确的类加载器!!!!!!"
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);