JNI编程:C++回调Java函数

该教程是本人一个字一个字输入的,转载请说明。


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));
//        }确定。

你可能感兴趣的:(C++回调Java函数,C/C++,Java,JNI编程,C++回调Java函数,vs生成dll,jni,c++)