JNI 调用C++代码 并在C++代码中调用Java传递进来的接口

来源:互联网 发布:淘宝高仿大牌女包推荐 编辑:程序博客网 时间:2024/06/05 22:32

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%\include\win32目录

参考:具体的编译器具体设置,我这里使用的是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 __cplusplusextern "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里传递中文会出现乱码情况
原创粉丝点击