该教程是本人一个字一个字输入的,转载请说明。
1、创建一个接口,如下所示:
public interface HelloWorld{
//回调函数
public void sayHello(String str);
}
2、创建java文件,在java文件中声明native方法,并且在类加载的时候加载动态链接库,本次java文件无包名。例子如下:
public class JniTest{
static {
System.loadLibrary("***");//相对路径
System.load("***");//绝对路径
}
public static native void JniHelloWorld(HelloWorld callback);
}
3、生成JniTest.h文件。
1)在工程路径下,按Shift+鼠标右键,选择"在此处打开命令窗口(W)"。
2)编译java类,生成JniTest.class。(命令:javac JniTest.java)
3)输入命令javah -classpath ./bin JniTest,然后按回车,这时发现多了一个JniTest.h文件。或者javah -jni JniTest
4、打开vs,创建新项目,步骤如下:
1)点击文件->新建->项目->Win32项目->Dll->完成
2)新建*.cpp和*.h文件。
PS:*.h中引入函数声明,extern "C" DLL_EXPORT BOOL 函数名(); // 初始化,可重复用
静态调用:#pragma comment(lib,"**.lib")
动态调用:
typedef int (*fAddFunc)(int *,int);
HINSTANCE hInstance = LoadLibraryA("dllTest.dll");//加载
if(hInstance != NULL)
fAddFunc fAddF = (fAddFunc)GetProcAddress(hInstance,"函数名");
3)导入JniTest.h文件,并把jni.h和jni_md.h文件引入。
5、编辑*.cpp文件,并生成*.dll,如下所示:
1)从JniTest.h中,引入JniHelloWorld函数,如下所示:
/*
* Class: LuminexNative
* Method: ReadData
* Signature: (LIJavaCallback;)Z
*/
JNIEXPORT jboolean JNICALL Java_JniTest_JniHelloWorld
(JNIEnv *, jclass , jobject );
2)添加两个形参,JNIEnv *env, jobject gJavaObj,别忘记JniTest.h也需要修改。
3)完成回调,代码如下:
jclass javaClass = env->GetObjectClass(gJavaObj);//获得类对象
if(javaClass == NULL){
printf("Fail to find javaClass\r\n");
}else{
jmethodID javaCallback = env->GetMethodID(javaClass,"sayHello","(Ljava/lang/String;)V");//获得类方法,千万别忘记;号
if(javaCallback == NULL){
printf("Fail to find jmethodID");
}else{
jstring str = env->NewStringUTF("Welcome to C++ Callback Java");//封装
env->CallVoidMethod(gJavaObj,javaCallback,str);//调用方法
}
}
3)点击生成。
6、加载动态链接库到Java工程目录下。
7、创建新Java文件,程序如下:
public class Callback{
public static void main(String args[]){
JniTest.JniHelloWorld(new HelloWorld() {
public void sayHello(String str){
System.out.println(str);
}
});
}
}
以Java Application运行。
8、new一个接口对象,自然就继承了该接口。
错误汇总:
1、如果加载某个dll出现“java.lang.UnsatisfiedLinkError:xxx.dll找不到指定的程序”,重装jdk
2、如果出现can't find dependent library是因为跟xxx.dll相关的dll没有加载进来
3、如果出现no jawin in java.library.path错误,将jawin.jar和jawin.dll放在java.library.path路径下,
1)下载jawin地址:http://jawinproject.sourceforge.net/,
2)java.library.path的路径可以通过: //java系统属性
// java.util.Properties props = System.getProperties();
// java.util.Enumeration keys = props.keys();
// String key = null;
// while(keys.hasMoreElements()){
// key = keys.nextElement().toString();
// System.out.println(key + "=" + props.get(key));
// }确定。