JNI native层、C++异步回调JAVA代码。JNI数据类型转换
来源:互联网 发布:caffe 怎么用 编辑:程序博客网 时间:2024/04/27 21:24
现在项目做移植的。
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,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
0 0
- JNI native层、C++异步回调JAVA代码。JNI数据类型转换
- 在JNI代码中异步回调Java层方法
- JNI java调用c函数 native 步骤 代码
- Java数据类型与JNI数据类型转换
- JNI-Native代码访问Java代码(一)
- jni层数据类型映射
- 安卓JNI调试、C++/C代码调试、native层调试策略
- c/c++ native 层 通过 JNI API 调用 java 层 的AudioTrack 来播放 音频文件
- JNI开发中native层与Java层的交互
- JNI Native数据类型与Java数据类型对照表
- android jni的使用,java中代码在native层实现
- JNI c代码回调java空方法
- JNI 数据类型转换
- JNI 数据类型转换
- JNI 数据类型转换
- JNI 数据类型转换
- JNI基本数据类型转换
- JNI 数据类型转换
- 写sql 比较时间大小
- JS中类和对象的创建方法和区别——新手启程
- STM32F302R8T6移植RT-THREAD SRAM配置
- 各种排序算法总结
- 啊啊啊
- JNI native层、C++异步回调JAVA代码。JNI数据类型转换
- vc++ 深入详解 2
- UVALive 5968 Blade and Sword(搜索)
- poj-1159-Palindrome
- Axure做轮播页
- 使kgtp支持存储超过一页的内存数据
- hdu1394-Minimum Inversion Number
- android之【LinearLayout线性布局代码实现】
- USB Mass Storage协议