问题是这样的,目前要通过java 去调用c++ dll 函数,然后c++ 回调我的java,代码如下
public interface GetSource {
void onCallback(String name);
}
public class DllTest {
static {
System.load("C:\\xxxx\\scan-v100.dll");
}
// JNI 声明本地函数
public native void init(GetSource callback);
public static void main(String[] args) {
DllTest caller = new DllTest();
caller.init(new GetSource() {
@Override
public void onCallback(String name) {
System.out.println("接收到了值"+name);
}
});
}
}
这两个文件都在同一个目录下
c++ 代码如下
void Java_DllTest_init(JNIEnv* env , jobject obj, GetSource callback)
{
// 将函数指针转换为 jlong 以便在 Java 中传递
jlong callbackPtr = reinterpret_cast<jlong>(callback);
jclass cls = env->FindClass("GetSource");
jmethodID methodID = env->GetMethodID(cls, "onCallback", "(Ljava/lang/String;)V");
if (methodID == NULL) {
// 找不到对应的方法
return;
}
// 创建一个 Java 字符串对象
jstring jstr = env->NewStringUTF("Hello from C++");
// 调用 Java 中的回调方法
env->CallVoidMethod(obj, methodID, jstr);
// 释放 jstring 对象
env->DeleteLocalRef(jstr);
}
问题来了,调用后报错
Exception in thread "main" java.lang.IncompatibleClassChangeError
at DllTest.init(Native Method)
at DllTest.main(DllTest.java:16)