Я пытаюсь обойти вызов метода JNIEnv-> DefineClass со всеми необходимыми параметрами, но он всегда возвращает ошибку java.lang.NoClassDefFoundError: ls.Hello (неправильное имя: ls / Hello), когда я пытаюсь вызвать метод из Java , Я не уверен, что не так.
Пожалуйста, смотрите код JNI ниже:
#include<jni.h>
#include<ls_TestClassLoader.h>
#include<iostream>
using namespace std;
//JNIEnv *, jobject, jstring, jbyteArray, jint
JNIEXPORT jclass JNICALL Java_ls_TestClassLoader_defineClassX(JNIEnv *env, jobject obj, jstring name, jbyteArray data, jint len){
JNIEnv &e=*env;
jboolean isCopy;
jclass cls= e.DefineClass(e.GetStringUTFChars(name,&isCopy),obj,e.GetByteArrayElements(data,&isCopy),500);
return cls;
}
Вот код TestClassLoader, который вызывает нативный
Также содержимое txt файла является файлом двоичного класса
public class TestClassLoader extends ClassLoader {
static {
System.loadLibrary("TestClassLoader");
}
private native Class defineClassX(String name, byte[] b, int len);
public TestClassLoader() {
super(TestClassLoader.class.getClassLoader());
}
@Override
public Class<?> findClass(String className) {
byte classByte[];
Class result = null;
result = (Class) classes.get(className);
if (result != null) {
return result;
}
try {
return findSystemClass(className);
} catch (Exception e) {
}
try {
classByte = loadData(className);
result = defineClassX(className, classByte, classByte.length);
classes.put(className, result);
return result;
} catch (Exception e) {
Logger.getLogger(TestClassLoader.class.getName()).log(Level.SEVERE, null, e);
return null;
}
}
private byte[] loadData(String name) {
try {
String res = "/"+name.replace(".", "/") + ".txt";
InputStream is = TestClassLoader.class.getResourceAsStream(res);
ByteArrayOutputStream os = new ByteArrayOutputStream();
int d = 0;
while ((d = is.read()) != -1) {
os.write(d);
}
return os.toByteArray();
} catch (IOException ex) {
Logger.getLogger(TestClassLoader.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
private Hashtable classes = new Hashtable();
}
Любая помощь очень ценится.
Спасибо