JNI编程:C++回调Java函数
来源:互联网 发布:php 工作流 编辑:程序博客网 时间:2024/05/18 04:01
该教程是本人一个字一个字输入的,转载请说明。
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));
// }确定。
- JNI编程:C++回调Java函数
- Andriod JNI编程之C++回调Java函数
- Andriod JNI编程之C++回调Java函数
- Andriod JNI编程之C++回调Java函数
- Andriod JNI编程之C++回调Java函数
- Andriod JNI编程之C++回调Java函数
- JNI编程中C调用Java实现。
- java c语言混合编程 jni
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
- Java通过JNI调用C/C++函数
- C/C++调用java---JNI常用函数
- JAVA通过JNI调用C函数Demo
- Java jni调用c函数实例
- C/C++调用java---JNI常用函数
- java jni 调用c语言函数
- Ndk学习之JNI构造函数(java-->C-->Java)
- JNI编程(Java访问C/C++ DLL)的大致步骤
- 使用JNI进行Java与C/C++语言混合编程
- 杂知识
- 剖析Force.com的多租户架构(5)- 总结
- int main(int argc, char* argv[])
- PreparedStatement和Statement区别
- 小结九种图
- JNI编程:C++回调Java函数
- 记一次在linux 平台上的优化调试
- 【Python】 string
- java中异常详解
- 安装valgrind时报错
- Zigbee之Z-Stack
- OpenGL一: 初始化窗口,简单画图
- ASP.NET网站性能优化之成员资格,角色,配置文件的优化
- POJ分类