当前位置:  编程技术>移动开发
本页文章导读:
    ▪QFileDialog 获取资料路径的疑问        QFileDialog 获取文件路径的疑问?在我的GUI里,这种方式无法保证文件的选取,获得文件路径; QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),                             .........
    ▪ 利用JNI开展对象操作        利用JNI进行对象操作       在JNI原理及实现中,只是实现了一个Helloworld。         回忆一下JNI的实现步骤:      1.编写native声明的JAVA类;      2.使用javac命令编译所编写的java类;      3..........
    ▪ JNI原理及兑现       JNI原理及实现       Jvm封装了各种操作系统实际的差异性的同时,提供了jni技术,使得开发者可以通过java程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交.........

[1]QFileDialog 获取资料路径的疑问
    来源: 互联网  发布时间: 2014-02-18
QFileDialog 获取文件路径的疑问?

在我的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


    
[2] 利用JNI开展对象操作
    来源: 互联网  发布时间: 2014-02-18
利用JNI进行对象操作

       在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


    
[3] JNI原理及兑现
    来源: 互联网  发布时间: 2014-02-18
JNI原理及实现

       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。



直接运行:



完成!


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3