JNI 调用C++代码 并在C++代码中调用Java传递进来的接口
2012-09-27 22:21
561 查看
1、编写Java代码
1.1、编写CallbackBehaviourpackage 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里传递中文会出现乱码情况相关文章推荐
- window下利用JNI在java代码中调用c/c++接口
- Jni 参数传递与操作——(C/C++ 代码与 java 代码的互相调用)
- JNI编程——Java与c++代码互相调用及数据传递
- JNI_最简单的Java调用C/C++代码
- Android JNI简单实例(Android java调用C/C++代码)
- 在java中调用c/c++代码的方法(jni)
- JNI_最简单的Java调用C/C++代码(自己整理)
- JNI实现最简单的JAVA调用C/C++代码
- 用JNI进行Java编程---从Java程序调用C/C++代码
- JNI之JAVA调用C++接口
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Cocos2dx引擎笔记——如何让Java和C++接口互相调用:JNI使用指南
- cocos2d-x 中多线程的c/c++代码通过JNI调用java代码
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- Cocos2d-x中通过JNI进行C++调用Java代码 JniHelper类的使用
- 【转】使用JNI进行混合编程:在C/C++中调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- JNI(1) 在java中调用本地c++代码
- c++代码通过JNI调用Java代码时用到的签名信息如何获取
- android jni开发 把一段java代码转换成c++方式调用