登录  /  注册
JNI和Qt通信 (Part 2)
php中文网
发布: 2016-06-07 15:00:24
原创
1198人浏览过

Part2 JNI数据转换成C数据 e.g. jstring -GetStringUTFChars(),NewStringUTF(),ReleaseStringUTFChars() 1 2 3 4 5 JNIEXPORT void JNICALL Java_JNISample_sampleFunction(JNIEnv* env, jobject obj, jstring name) { const char * pname = env-GetStringUT

Part2

JNI数据转换成C数据

e.g. jstring - GetStringUTFChars(), NewStringUTF(), ReleaseStringUTFChars()

1

2

3

4

5

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

1

2

3

4

5

6

7

8

9

10

11

12

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;

}

http://ironurbane.iteye.com/blog/425513

JNI的数据定义

1

2

3

4

5

6

7

8

9

10

11

12

// 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 Type Native Type Description
boolean jboolean 8 bits, unsigned
byte jbyte 8 bits, signed
char jchar 16 bits, unsigned
double jdouble 64 bits
float jfloat 32 bits
int jint 32 bits, signed
long jlong 64 bits, signed
short jshort 16 bits, signed
void void N/A

JNI的类型签名

Java Type Signature
boolean Z
byte B
char C
double D
float F
int I
long J
void V
object Lfully-qualified-class;
type[] [type
method signature ( arg-types) ret-type

e.g.

Java side

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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,"","()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:

1

javap -s -p -classpath R:\test.Demo

Check JNI version

1

2

3

#ifdef JNI_VERSION_1_4

printf("Version is 1.4 \n");

#endif

使用API

1

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)


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---

相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 技术文章
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2023 //m.sbmmt.com/ All Rights Reserved | 苏州跃动光标网络科技有限公司 | 苏ICP备2020058653号-1

 | 本站CDN由 数掘科技 提供

登录PHP中文网,和优秀的人一起学习!
全站2000+教程免费学