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里传递中文会出现乱码情况声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Java JNI实现原理初探
- 下一篇: 如何通过JNI传递对象执行回调