すべての必要なパラメータでJNIEnv-> DefineClassメソッドをバイパスしようとしていますが、常にjava.lang.NoClassDefFoundError:lsを返します。 Hello(間違った名前:ls/Hello)javaからメソッドを呼び出そうとするとエラーが発生します。何が間違っているのか分かりません。下記のJNIコードを参照してください :jni定義クラスメソッド例外メッセージ:ls.Hello(間違った名前:ls/Hello)
#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コードはまた、バイナリクラスファイルが
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();
}
txtファイルの内容をですどんな助けでも大歓迎です。
おかげ
私のoringinalで私は配列の長さとしてlenを渡しました、そして、ここで私はメソッドを呼び出す方法です。 ls.Helloは実際のパブリッククラスMain { public static void main(String [] args)ClassNotFoundException、InstantiationException、IllegalAccessExceptionをスローします。{ TestClassLoader tl = new TestClassLoader();HelloI hi =(HelloI)tl.loadClass( "ls.Hello")。newInstance(); System.out.println(hi.sayHello()); } } –
問題が見つかりました。私の編集を参照してください。 – Mersenne
素晴らしい!!!!!!!!!!!!!!!!。ありがとう、それは多く働いた。 –