在我的GUI里,这种方式无法保证文件的选取,获得文件路径;
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
"/home",
tr("Images (*.png *.xpm *.jpg)"));
窗口弹出,很大,卡住了,无法选取文件。但是这种方式单独写在demo里面又没有 问题。
但是通过如下方式,则可以:
QStringList sFilePath;
QFileDialog *fDialog=new QFileDialog(this,"file dlg","/data","All files(*.irm)");if(fDialog->exec()==QFileDialog::Accepted) // ok
{
sFilePath = fDialog->selectedFiles();
qDebug()<<"sFilePath"<<sFilePath.at(0);
}
窗口弹出,比较小,可以选取文件。
百思不得其解。贴出来,让有遇到过类似问题或者高见的不妨发表意见和建议,互相谈论学习进步!
借鉴文章:
http://blog.csdn.net/xie376450483/article/details/5811931
在JNI原理及实现中,只是实现了一个Helloworld。
回忆一下JNI的实现步骤:
1.编写native声明的JAVA类;
2.使用javac命令编译所编写的java类;
3.使用Javah生成JNI头文件.h;
4.编写本地方法实现方法;
5.生成动态库;(如果方法实现是cpp写的话就一定要用g++来编译)
6.在java中调用。
下面的一个例子是C\C++与Java之间进行对象的操作。
1.创建Student类
/*
* FileName:Student.java
* Description:Class Student
* */
package pojo;
public class Student {
private int id;
private String name;
public Student(){}
public Student(int _id,String _name)
{
this.id=_id;
this.name=_name;
}
public void setId(int _id)
{
this.id=_id;
}
public void setName(String _name)
{
this.name=_name;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public String toString()
{
return "Name:"+name+" id:"+id;
}
}
2.创建主调类
/*
* FileName:JniMain.java
* Description:Main class
* */
package pojo;
public class JniMain {
static{
System.loadLibrary("studentbean");
}
public static native void sayHello();
public native int getId();
public native void setId(int i);
public native void setName(String _name);
public native Student getStudent();
public static void main(String[] args) {
// TODO Auto-generated method stub
JniMain test=new JniMain();
test.setId(101);
test.setName("Rose");
Student tmp=test.getStudent();
System.out.println("Id:"+tmp.getId());
System.out.println("Name:"+tmp.getName());
test.sayHello();
}
}
3.编译java,生成.h
sudo javac pojo/JniMain.java pojo/Student.java
javah -classpath . -jni pojo.JniMain
4.根据.h文件写函数实现
创建pojo_JniMain.cpp
#include"pojo_JniMain.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int id=1;
jobject student;
jstring name;
JNIEXPORT void JNICALL Java_pojo_JniMain_sayHello
(JNIEnv *evn, jclass cla)
{
printf("shit~\n");
}
JNIEXPORT jint JNICALL Java_pojo_JniMain_getId
(JNIEnv *evn, jobject thiz)
{
return id;
}
JNIEXPORT void JNICALL Java_pojo_JniMain_setId
(JNIEnv *evn, jobject thiz, jint ji)
{
id=ji;
}
JNIEXPORT void JNICALL Java_pojo_JniMain_setName
(JNIEnv *env, jobject thiz, jstring _name)
{
//name=env->GetStringUTFChars(_name, 0);
jclass studentClass = env->FindClass("pojo/Student");
jmethodID studentMethod = env->GetMethodID(studentClass,"<init>","()V");
jfieldID mId = env->GetFieldID(studentClass,"id","I");
jfieldID mstudentName = env->GetFieldID(studentClass,"name","Ljava/lang/String;");
jobject studentObject = env->NewObject(studentClass,studentMethod);
env->SetObjectField(studentObject,mstudentName,_name);
env->SetIntField(studentObject,mId,id);
student = studentObject;
}
JNIEXPORT jobject JNICALL Java_pojo_JniMain_getStudent
(JNIEnv *env, jobject thiz)
{
return student;
}5.编译动态库
sudo g++ -shared -I /usr/local/lib/jdk1.6.0_29/include/ -I /usr/local/lib/jdk1.6.0_29/include/linux/ pojo_JniMain.cpp -o libstudentbean.so
6.运行
结果如下:
参考: Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)-http://blog.csdn.net/u_xtian/article/details/6033963
Jvm封装了各种操作系统实际的差异性的同时,提供了jni技术,使得开发者可以通过java程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过jni提供的相应原生接口开调用java应用系统内部实现的功能。
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
Jni对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用c/c++来实现一个代理程序(jni程序)来实际操作目标原生函数,java程序中则是jvm通过加载并调用此jni程序来间接地调用目标原生函数。
JNI调用过程
下面就简单实现一下。
环境
Ubuntu 12.10 java version "1.6.0_29"
1.创建项目
在Eclipse创建一个java项目,然后新建HelloWorld类,内容如下:
package Hello;
public class HelloWorld {
static {
System.loadLibrary("HelloWorld");
}
private native void print();
public static void main(String args[]) {
new HelloWorld().print();
}
}项目层次如下图:
2.编译.java文件
在命令行进入src文件夹,首先编译.java
javac Hello/HelloWorld.java
然后编译头文件
javah -classpath . -jni Hello.HelloWorld
在src目录下面就会生成一个Hello_HelloWorld.h的头文件,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello_HelloWorld */
#ifndef _Included_Hello_HelloWorld
#define _Included_Hello_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello_HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif里面声明了Java_Hello_HelloWorld_print需要我们去实现。
3.使用本地方法实现头文件中的方法
将生成的.h 文件拷到Hello文件夹内,创建HelloWorld.c文件。
#include <jni.h>
#include <stdio.h>
#include "Hello_HelloWorld.h"
JNIEXPORT void JNICALL Java_Hello_HelloWorld_print
(JNIEnv *env, jobject obj)
{
printf("HelloWorld JNI!\n");
return;
}4.编译动态库
在Hello目录下面终端运行
gcc -shared -I /usr/local/lib/jdk1.6.0_29/include/ -I /usr/local/lib/jdk1.6.0_29/include/linux/ HelloWorld.c -o libHelloWorld.so
-shared指的是编译共享库,后缀名为.so,-I是添加搜索目录
结果就这样:
5.在eclipse中运行
首先将动态库的搜索路径添加到项目中,Eclipse中:
Project->properties->Java Build Path->Source
设置Native Library Location。
直接运行:
完成!