JNI native层、C++异步回调JAVA代码。JNI数据类型转换
2014-08-04 15:42
561 查看
现在项目做移植的。
windows转移到Linux下,多进程的程序。
本来windows下用MFC做的界面,现在决定Linux下界面用java或者python做。。。
java和其他C++进程用JNI来融合到一起。。。
java部分的代码如下:
其中只有一个函数是需要CPP这边实现。
设想的是通过这个函数高速CPP,java这边OK,CPP可以随时回调nativeCallBack把数据给java界面显示。
java代码完成后要通过javah生成头文件,然后CPP去实现。
C++代码:
CPP代码有些问题,没做完,但是能完成CPP这边异步回调java的函数。
关键在于保存了JNIENV和JOBJECT这两个对象。
查资料是说他们是线程敏感的,必须先在java调用C++时把JVM拿到。
在之后任意时候都可以通过JVM拿到当前线程的ENV对JAVA的函数进行调用。
关于JNI的数据类型转换资料:
http://blog.csdn.net/jinhill/article/details/6918821
windows转移到Linux下,多进程的程序。
本来windows下用MFC做的界面,现在决定Linux下界面用java或者python做。。。
java和其他C++进程用JNI来融合到一起。。。
java部分的代码如下:
public class NativeTool implements Serializable { /** * */ private static final long serialVersionUID = 1L; static { try { System.loadLibrary("nativeCpp_NativeTool"); } catch(UnsatisfiedLinkError e) { System.out.println( "Cannot load nativeCpp_NativeTool library:\n " + e.toString() ); } } private Service service; public NativeTool() { } public native boolean readyToPlay(); public void setService(Service service) { this.service = service; } public void nativeCallBack(byte[] imageData) { //service.nativeToolCallBack(imageData); System.out.println("java nativeCallBack system out"); for (int i = 0; i < imageData.length; i++) { System.out.println(imageData[i]); } } }
其中只有一个函数是需要CPP这边实现。
设想的是通过这个函数高速CPP,java这边OK,CPP可以随时回调nativeCallBack把数据给java界面显示。
java代码完成后要通过javah生成头文件,然后CPP去实现。
C++代码:
#include "nativeCpp_NativeTool.h" #include <string.h> #include <pthread.h> #include <unistd.h> JavaVM* g_jvm; jobject g_obj; //HANDLE hThread=NULL; //DWORD dwThreadID=0; void* thread(void* ptr) { FILE* fp = fopen("a.bmp", "rb"); if (fp != NULL) { fclose(fp); } JNIEnv *env; g_jvm->AttachCurrentThread((void **)&env, NULL); jclass cls = env->GetObjectClass(g_obj); jmethodID id_nativeCallBack = env->GetMethodID(cls,"nativeCallBack","([B)V"); unsigned char param[5] = {'1', '2', '3', '4', '5'}; while(1) { //usleep(5000); sleep(5); printf("c++ thread running... \n"); //////////// jbyteArray jarrRV = env->NewByteArray(5); jbyte* jby = env->GetByteArrayElements(jarrRV, 0); memcpy(jby, param, 5); env->SetByteArrayRegion(jarrRV, 0, 5, jby); //////////// env->CallVoidMethod(g_obj, id_nativeCallBack, jarrRV); } return 0; } JNIEXPORT jboolean JNICALL Java_nativeCpp_NativeTool_readyToPlay (JNIEnv * env, jobject obj) { env->GetJavaVM(&g_jvm); g_obj = env->NewGlobalRef(obj); jclass class_NativeTool = env->GetObjectClass(obj); //hThread=CreateThread(0,0,ThreadMethod,NULL,0,&dwThreadID); //CloseHandle(hThread); pthread_t id; int ret = pthread_create(&id, NULL, thread, NULL); if(ret) { printf("create pthread error!... \n"); return 1; } //pthread_join(id, NULL); printf("c++ source printf... \n"); jmethodID id_nativeCallBack = env->GetMethodID(class_NativeTool,"nativeCallBack","([B)V"); unsigned char param[5] = {'1', '2', '3', '4', '5'}; //////////// jbyteArray jarrRV = env->NewByteArray(5); jbyte* jby = env->GetByteArrayElements(jarrRV, 0); memcpy(jby, param, 5); env->SetByteArrayRegion(jarrRV, 0, 5, jby); //////////// env->CallVoidMethod(obj, id_nativeCallBack, jarrRV); return true; }
CPP代码有些问题,没做完,但是能完成CPP这边异步回调java的函数。
关键在于保存了JNIENV和JOBJECT这两个对象。
查资料是说他们是线程敏感的,必须先在java调用C++时把JVM拿到。
在之后任意时候都可以通过JVM拿到当前线程的ENV对JAVA的函数进行调用。
关于JNI的数据类型转换资料:
http://blog.csdn.net/jinhill/article/details/6918821
相关文章推荐
- Java JNI开发时常用数据类型与C++中数据类型转换
- Java JNI 编程进阶 实例+c++数据类型与jni数据类型转换
- Jni中C++和Java的数据类型的对应关系
- [Android] Jni中C++和Java的数据类型的对应关系
- JNI中如何在本地代码C++中操作java中的基本类型的数组以及对象数组
- Java数据类型与JNI数据类型转换
- C++程序员学Java系列之五:常量,变量,基本数据类型及转换
- JNI学习--Java和C、C++之间的数据类型映射之string
- Android中JNI使用详解(4)---Java与C之间数据类型转换
- java主类结构、基本数据类型、 变量与常量、运算符、数据类型转换、代码注释与编码规范
- JNI与C++的数据类型转换
- android jni开发 把一段java代码转换成c++方式调用
- Android NDK的C/C++代码中利用JNI回调实现字符编码转换的试验(中文UTF8与GBK)
- Android NDK的C/C++代码中利用JNI回调实现字符编码转换的试验(中文UTF8与GBK)
- NDK编程:JNI与Java,C++字符类型转换
- Jni中C++和Java的数据类型的对应关系
- java/android 使用swig编译c/c++ 代码类型转换
- JNI中Java与C++的类型转换与相互调用
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- Cocos2d中JniHelper获取JNIENV及C++与Java间类型转换