JNI和Qt通信 (Part 2)
来源:互联网 发布:js 点击显示大图 编辑:程序博客网 时间:2024/06/08 06:04
Part2
JNI数据转换成C数据
e.g. jstring - GetStringUTFChars(), NewStringUTF(), ReleaseStringUTFChars()
JNIEXPORT
void
JNICALL Java_JNISample_sampleFunction(JNIEnv* env, jobject obj, jstring name)
{
const
char
* pname = env->GetStringUTFChars(name, NULL);
env->ReleaseStringUTFChars(name, pname);
}
e.g. Array
JNIEXPORT jint JNICALL Java_IntArray_sumArray
(JNIEnv *env, jobject obj, jintArray arr) {
jint buf[10];
jint i, sum = 0;
// This line is necessary, since Java arrays are not guaranteed
// to have a continuous memory layout like C arrays.
env->GetIntArrayRegion(arr, 0, 10, buf);
for
(i = 0; i < 10; i++) {
sum += buf[i];
}
return
sum;
}
<Refer to> http://ironurbane.iteye.com/blog/425513
JNI的数据定义
// In "win\jni_mh.h" - machine header which is machine dependent
typedef
long
jint;
typedef
__int64
jlong;
typedef
signed
char
jbyte;
// In "jni.h"
typedef
unsigned
char
jboolean;
typedef
unsigned
short
jchar;
typedef
short
jshort;
typedef
float
jfloat;
typedef
double
jdouble;
typedef
jint jsize;
C++ 调用Java方法
Read: http://stackoverflow.com/questions/819536/how-to-call-java-function-from-c
Windows http://public0821.iteye.com/blog/423941
Linux http://blog.sina.com.cn/s/blog_48eef8410100fjxr.html
JNI数据类型
Java TypeNative TypeDescriptionbooleanjboolean8 bits, unsignedbytejbyte8 bits, signedcharjchar16 bits, unsigneddoublejdouble64 bitsfloatjfloat32 bitsintjint32 bits, signedlongjlong64 bits, signedshortjshort16 bits, signedvoidvoidN/A
JNI的类型签名
Java TypeSignaturebooleanZbyteBcharCdoubleDfloatFintIlongJvoidVobjectLfully-qualified-class;type[][typemethod signature( arg-types) ret-typee.g.
Java side
class
JNISample
{
public
native
void
launchSample();
static
{
System.loadLibrary(
"Sample"
);
}
public
static
int
add(
int
a,
int
b) {
return
a+b;
}
public
boolean
judge(
boolean
bool) {
return
!bool;
}
}
C++side
JNIEnv *env = GetJNIEnv();
//Get env from JNI
jclass cls;
cls = env->FindClass(
"JNISample"
);
if
(cls !=0)
{
printf
(
"find java class success\n"
);
// constructor
mid = env->GetMethodID(cls,
"<init>"
,
"()V"
);
if
(mid !=0)
{
jobj=env->NewObject(cls,mid);
}
// static function
mid = env->GetStaticMethodID( cls,
"add"
,
"(II)I"
);
if
(mid !=0)
{
square = env->CallStaticIntMethod( cls, mid, 5,5);
}
// function returns boolean
mid = env->GetMethodID( cls,
"judge"
,
"(Z)Z"
);
if
(mid !=0){
jnot = env->CallBooleanMethod(jobj, mid, 1);
}
}
查看属性和方法的签名
Java版本 "java -version"
反编译工具 javap:
javap -s -p -classpath R:\test.Demo
Check JNI version
#ifdef JNI_VERSION_1_4
printf
(
"Version is 1.4 \n"
);
#endif
使用API
jint GetVersion(JNIEnv *env);
返回值需要转换, Need convert the result from DEC to HEX;
JNI实现过程中的Issue
x86 or x64 "Can't load load IA 32-bit dll on a amd 64 bit platform"
确定本机上的默认JVM的版本和动态库的版本一致(x86或x64), Make sure JAVA's default path; check with "java -version" in command line.
3rdParty can't find dependent libraries 保证所依赖的动态库都能被找到;
1) copy the dll into executable file's folder 2) System.load() the dlls by dependecy orders
JNI_CreateJavaVM failed
C++创建JVM调用Java方法
http://docs.oracle.com/javase/1.4.2/docs/guide/jni/jni-12.html#JNI_CreateJavaVM & http://blog.csdn.net/louka/article/details/7318656
[我机器上装了多个版本的Java, 测试的时候没有成功]
jvm.dll(C:\Program Files (x86)\Java\jdk1.7.0_17\jre\bin\client; C:\Program Files (x86)\Java\jdk1.7.0_17\jre\bin\server; need check); jvm.lib(C:\Program Files (x86)\Java\jdk1.7.0_17\lib)
<Refer to> http://home.pacifier.com/~mmead/jni/cs510ajp/ & http://www.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
Sample http://chnic.iteye.com/category/20179
JNI doc http://docs.oracle.com/javase/7/docs/technotes/guides/jni/
>JNA https://github.com/twall/jna/ XstartOnFirstThread
---End---
- JNI和Qt通信 (Part 2)
- JNI和Qt通信 (Part 1)
- JNI和Qt通信 (Part 3)
- JNI加载Native Library 以及 跨线程和Qt通信
- JNI加载Native Library 以及 跨线程和Qt通信
- 《Qt》part 5 Qt5.5.0串口通信
- Qt TCP和UDP通信2
- JNI-Java和C之间通信
- QT C++和HTML通信
- QT 串口通信2
- 《Qt》part 2 设置软件左上角图标
- 《MFC网络通信》Part 2 简单TCP通信
- Qt开发:TCP和UDP网络通信
- Qt TCP和UDP通信1
- Part 01 走近Qt
- Part 01 走近Qt
- jni和C++通信中文乱码的问题
- jni和C++通信中文乱码的问题
- 开始做一个合格的程序员吧
- 我也写博客
- junit学习笔记(一):JUnit的安装和测试原则
- Activity生命周期有啥用?
- MyBatis+Spring 基于接口编程的原理分析
- JNI和Qt通信 (Part 2)
- 利用Hibernate映射文件生oracle或者mysql数据库
- 使用安卓内置的pull解析器解析xml文档,并自动映射成bean
- work_queue变化
- POJ--3321--Apple Tree
- C语言之常用标准输入输出函数库<stdio.h>
- linux下arm交叉编译环境的建立
- 将click事件处理语句写在href属性值中
- http://download.csdn.net/detail/matrixhero/4645105 block 回调