JNI 调用C++代码 并在C++代码中调用Java传递进来的接口
1、编写Java代码
1.1、编写CallbackBehaviour
package com.diqye.jni.callback;
public interface CallbackBehaviour {
public void callback(String name, int age);
}
1.2、编写测试类Test
package com.diqye.jni.callback;
public class Test {
static{
System.loadLibrary("callback");
}
public native void run(CallbackBehaviour callbackBehaviour);
public static void main(String[] args) {
new Test().run(new CallbackBehaviour() {
public void callback(String name, int age) {
System.out.println("DLL 传递过来的名字 " + name);
System.out.println("DLL 传递过来的年龄" + age);
}
});
}
}
2、命令行运行javah -jni fileName使生成头文件
3、配置C++ 使之包含%java_home%include和%java_home%includewin32目录
参考:具体的编译器具体设置,我这里使用的是DEVc++ 配置 G++
4、编写C++代码实现Java的本地代码
第二步生成的头文件/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_diqye_jni_callback_Test */
#ifndef _Included_com_diqye_jni_callback_Test
#define _Included_com_diqye_jni_callback_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_diqye_jni_callback_Test
* Method: run
* Signature: (Lcom/diqye/jni/callback/CallbackBehaviour;)V
*/
JNIEXPORT void JNICALL Java_com_diqye_jni_callback_Test_run
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
实现头文件声明的方法#include
#include
#include "com_diqye_jni_callback_Test.h"
using namespace std;
JNIEXPORT void JNICALL Java_com_diqye_jni_callback_Test_run
(JNIEnv* env, jobject javaSelf, jobject callback){
cout<<"c++ code start execute"<GetObjectClass(callback);
//获得callback对象中特定方法callback的id
jmethodID methodId;
methodId=env->GetMethodID(cls_objClass,"callback","(Ljava/lang/String;I)V");
if(methodId){
cout<<"调用方法失败"<<endl;
}
//调用callback对象的特定方法callback
cout<<"执行env->CallObjectMethod(callback,methodId,name,21);"<<endl;
jstring name = env->NewStringUTF("diqye");
env->CallObjectMethod(callback,methodId, name,21);
cout<<"c++ code execute end"<<endl;
}
5、编译成Dll放到共享库中( 一般为Path所指定的路径)并运行
我这边能看到正确的效果 在C++中往Java里传递中文会出现乱码情况声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
