JNI和Qt通信 (Part 2)

来源:互联网 发布:js 点击显示大图 编辑:程序博客网 时间:2024/06/08 06:04

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

<Refer to> 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 TypeNative TypeDescriptionbooleanjboolean8 bits, unsignedbytejbyte8 bits, signedcharjchar16 bits, unsigneddoublejdouble64 bitsfloatjfloat32 bitsintjint32 bits, signedlongjlong64 bits, signedshortjshort16 bits, signedvoidvoidN/A

JNI的类型签名

Java TypeSignaturebooleanZbyteBcharCdoubleDfloatFintIlongJvoidVobjectLfully-qualified-class;type[][typemethod signaturearg-typesret-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,"<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: 

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)


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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办 华为开机键坏了怎么办 抖音账号已重置怎么办 抖音账号被重置怎么办 吃鸡账号密码忘了怎么办 微信只记得账号忘了手机号怎么办 红米3开机键失灵怎么办 晚自习教室有许多虫子怎么办 泰迪吃草又呕吐怎么办 手机不断收到验证码信息怎么办 樱桃吃多了上火怎么办 过年不想回婆婆家过怎么办 旅行箱提手坏了怎么办 影棚人物后面有影子怎么办 微信运动图标不见了怎么办 逆光拍摄人黑了怎么办 单反镜头刮花了怎么办 股东各50股份不同意退股怎么办 退股没有协议他不愿意退钱怎么办 s7刷机有三星帐号id怎么办 做主播留不住人怎么办 直播间留不住人怎么办 淘宝直播间留不住人怎么办