您的位置:首页 > 编程语言 > C语言/C++

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

2012-09-27 22:21 561 查看

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 __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里传递中文会出现乱码情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: