「java如何调用qt」Java如何调用接口
今天给各位分享java如何调用qt的知识,其中也会对Java如何调用接口进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java访问Qt编写的dll
- 2、怎么用qt调用java?
- 3、qml语言可以与java交互吗
- 4、Qt for Android生成的so库,在Java for Android中被调用,请问有什么思路吗?
- 5、谁能给一个 Qt 跟 java 用socket通讯的例子,要求java 做服务端,qt 做客户端,要求双方都能实时显示对方发过
Java访问Qt编写的dll
1、使用JNI
2、JNative简单示例
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
public class SystemTime extends AbstractBasicDataSystemTime {
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
public Pointer createPointer() throws NativeException {
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
return pointer;
}
public int getSizeOf() {
return 8 * 2;
}
public SystemTime getValueFromPointer() throws NativeException {
wYear = getNextShort();
wMonth = getNextShort();
wDayOfWeek = getNextShort();
wDay = getNextShort();
wHour = getNextShort();
wMinute = getNextShort();
wSecond = getNextShort();
wMilliseconds = getNextShort();
return this;
}
public SystemTime() throws NativeException {
super(null);
createPointer();
mValue = this;
}
@Override
public String toString() {
return wYear + "/" + wMonth + "/" + wDay + " at " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds;
}
public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");
SystemTime systemTime = new SystemTime();
nGetSystemTime.setParameter(0, systemTime.getPointer());
nGetSystemTime.invoke();
return systemTime.getValueFromPointer();
}
public static void main(String[] args) throws NativeException, IllegalAccessException {
System.err.println(GetSystemTime());
}
}
这个就是简单示例,调用系统的dll和调用qt的dll有区别吗?qt也应该是export出来入口点吧,原理上应该一样的。
怎么用qt调用java?
我做过QT写界面,再嵌入C语言程序完成通信部分,因为C++编译器兼容C语言,所以可行。
extern "c"
{
/*C代码*/
}
但应该不可能嵌入
extern “java”
{
}
编译通不过的。
qml语言可以与java交互吗
选择了使用QML调用C++注册的单例函数这样的方法来实现调用C++代码,然后再通过QtAndroidJniObject::callMethod()来调用Java的本地方法。为了实现这样一个功能,除了在上篇文章介绍的注册QML单例之外,还必须在该函数中调用Android方法。下面是SDActivityDelegateSingleton类的实现:
SDActivityDelegateSingleton.h
#ifndef ADSINGLETON_H
#define ADSINGLETON_H
#include QObject
// Android:绑定SuperDoctorActivity,负责广告API的调用
class SDActivityDelegateSingleton: public QObject
{
Q_OBJECT
public:
SDActivityDelegateSingleton( QObject* pParent = Q_NULLPTR ):
QObject( pParent )
{
}
Q_INVOKABLE void call( const QString methodName );
};
#endif // ADSINGLETON_H
SDActivityDelegateSingleton.cpp
#include "SDActivityDelegateSingleton.h"
#if defined(Q_OS_ANDROID) !defined(Q_OS_ANDROID_NO_SDK)
#include QtAndroid
void SDActivityDelegateSingleton::call( const QString methodName )
{
const QAndroidJniObject activity = QtAndroid::androidActivity( );
qDebug( "method name is: %s", qPrintable( methodName ) );
activity.callMethodvoid( qPrintable( methodName ) );
}
#else
void SDActivityDelegateSingleton::call( const QString methodName )
{
qDebug( "the desktop does not implement calling method: %s",
qPrintable( methodName ) );
}
#endif
然后在是SuperDoctorActivity.java:
// SuperDoctorActivity.java 这个Java文件重写了Android的Activity
package com.jcystudio.superdoctor;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.FrameLayout;
import android.view.Gravity;
import org.qtproject.qt5.android.bindings.QtActivity;
……
public class SuperDoctorActivity extends QtActivity
{
@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate(savedInstanceState);
……
SmartBannerManager.init(this);
}
……
public void showSmartAD( )
{
SmartBannerManager.show( this );
}
}
这样,通过QML就可以调用Java代码了,调用方法是:
……
function prepare( )
{
SDActivity.call( "showSmartAD" );// ←调用Java方法
this.focus = true;// 获得按键焦点,可以使用按键控制
Controller.clearBlocks( );
Controller.setupGame( mode, difficulty, map, actions, colors );
headerSprite.currentFrame = 2;// 小人指向平常的位置
readyMask.visible = true;
backgroundMusic.play( );
}
Qt for Android生成的so库,在Java for Android中被调用,请问有什么思路吗?
可以调用,但是不能直接调用,要通过代码目的JNI去调用,在JNI中导入头文件,通过NDK编译成功后即可。
NDK编译步骤:
1.选择 ndk 自带的例子 hello-jni ,我的位于E:\android-ndk-r5\samples\hello-jni( 根据具体的安装位置而定 ) 。
2.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。
3.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )
4.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,ndk 就运行正常啦。
谁能给一个 Qt 跟 java 用socket通讯的例子,要求java 做服务端,qt 做客户端,要求双方都能实时显示对方发过
提供一个聊天功能的给你
import java.net.*;
import java.io.*;
class My1 extends Thread
{
private Socket skt;
public My1(Socket skt)
{
this.skt = skt;
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));
for(;;)
{
if(br.readLine()==null) {break;}
System.out.println(br.readLine()); // 阻塞
}
}
catch(Exception e)
{
System.out.println("对方断线!");
}
}
}
class My2 extends Thread
{
private Socket skt;
public My2(Socket skt)
{
this.skt = skt;
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(skt.getOutputStream());
for(;;)
{
pw.println("姓名====:"+br.readLine()); // 阻塞
pw.flush();
}
}
catch(Exception e)
{
System.out.println("对方断线!");
}
}
}
public class Good
{
public static void main(String[] args) throws Exception
{
//连接的目的是:获得Socket对象
Socket skt;
System.out.print("请输入port 或者:ip,port ");
// 先选择角色
String[] ss = new BufferedReader(new InputStreamReader(System.in)).readLine().split(",");
if(ss.length==1)
skt = new ServerSocket(Integer.parseInt(ss[0])).accept();
else
skt = new Socket(ss[0], Integer.parseInt(ss[1]));
System.out.println("连接到:" + skt.getInetAddress().getHostAddress());
// 连接建立,角色消失
new My1(skt).start(); //读网络
new My2(skt).start(); //读键盘
}
}
关于java如何调用qt和Java如何调用接口的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。