牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2012-09-27 投稿人: 浏览次数:3906

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里传递中文会出现乱码情况
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。