Selamün Aleyküm;
C++ ile Jni denemesi yapmak istedim, lakin hatalar peşimi bırakmıyor. İntenette herkesi Java'dan C/C++ kodları çağırıyor ama ben tam tersini yapıyorum: C++'dan Java kodu çağırıyorum. Yazdığım kodlar şöyle:
Code.java:
package com.xxx;
public class Code
{
public void getMessage()
{
System.out.println("Hello World!");
}
}
main.cpp:
#include <jni.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
JavaVM* jvm;
JNIEnv* env;
JavaVMInitArgs jvm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=myclasses";
jvm_args.version = JNI_VERSION_1_2;
jvm_args.options = options;
jvm_args.nOptions = 1;
jvm_args.ignoreUnrecognized = JNI_TRUE;
jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &jvm_args);
if (res < 0)
{
cout << "Cannot create JVM!\n";
exit(1);
}
jclass class_ = env->FindClass("com/xxx/Code");
if (class_ == 0)
{
cout << "Code class not found!\n";
exit(1);
}
jmethodID method_id = env->GetMethodID(class_, "getMessage", "()V");
if (method_id == 0)
{
cout << "getMessage() method not found!\n";
exit(1);
}
env->CallVoidMethod(class_, method_id);
return 0;
}
Dosyalarımın dizinleri:
https://i.stack.imgur.com/hJgB0.png
Bu kodlardan aldığım hata şu: 'Code class not found!'. İlginç olan ise dizinleri gösteren resimden de göreceğiniz üzere 'Code.java''nın 'myclasses/com/xxx' dizini altında bulunmasına rağmen sınıfı bulamıyor, yani FindClass NULL döndürüyor. Bu kodları Oracle'ın sitesinden okuyarak yazdım.
Bu suali yabancı birçok forumda vs. sordum lakin hiç kimse kodlarda bir hata olduğunu söylemedi ve sonuca ulaşamadığım yanıtlar aldım. 'Code.java' sınıfının normalde çalışıp çalışmadığını sordular, bu sınıfı QAndroidExtras modülü yardımıyla çağırdığımda çalıştı ama saf Jni ile çalışmıyor. Çünkü ne hikmetse sınıfı bulamıyor. Sınıfı bulamadığını bir istisna ile anladım:
Exception in thread "main" java.lang.NoClassDefFoundError: com/xxx/Code
Caused by: java.lang.ClassNotFoundException: com.xxx.Code
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f7ecb626304, pid=10848, tid=0x00007f7ecc138740
#
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V [libjvm.so+0x6da304] get_method_id(JNIEnv_*, _jclass*, char const*, char const*, bool, Thread*)+0x84
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/username/My Projects/build-JNIExample-Desktop_Qt_5_7_0_GCC_64bit-Debug/hs_err_pid10848.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
Press <RETURN> to close this window...
Bu sorun ile uğraşan oldu mu? Teşekkürler.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply