自己的笔记(未完待续)
QT的安卓外壳activity里,为QT的C代码添加环境变量(作为参数传递)
修改QTactivity.java 添加别的类传递过来的参数 保存到ENVIRONMENT_VARIABLES中
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(getIntent().getExtras()!= null && getIntent().getExtras().containsKey("android_call_activity_variables")){
ENVIRONMENT_VARIABLES = ENVIRONMENT_VARIABLES
+"\t"+getIntent().getExtras().getString("android_call_activity_variables");
}
public void onServiceConnected(ComponentName name, IBinder service)
{
m_service = IMinistro.Stub.asInterface(service);
try {
if (m_service!=null)
{
Log.e("ding","ENVIRONMENT_VARIABLES:" + ENVIRONMENT_VARIABLES);
Bundle parameters= new Bundle();
parameters.putStringArray(REQUIRED_MODULES_KEY, m_qtLibs);
parameters.putString(APPLICATION_TITLE_KEY, (String)QtActivity.this.getTitle());
parameters.putInt(MINIMUM_MINISTRO_API_KEY, MINISTRO_API_LEVEL);
parameters.putString(QT_PROVIDER_KEY, QT_PROVIDER);
parameters.putInt(MINIMUM_QT_VERSION_KEY, QT_VERSION);
parameters.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES);
if (null!=APPLICATION_PARAMETERS)
parameters.putString(APPLICATION_PARAMETERS_KEY, APPLICATION_PARAMETERS);
// parameters.putStringArray(REPOSITORIES, null);
m_service.requestLoader(m_ministroCallback, parameters);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
QT hello工程中,C代码 1.取得环境变量 2.从安卓的so得到变量
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLibrary>
#include "qprocess.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
callndk();
envfromandroid();
Jvm *jvm= new Jvm();
jvm->callvm();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::envfromandroid()
{
QString env = "text from: " + QProcessEnvironment::systemEnvironment().value("hello_qt");
// QProcessEnvironment environment = QProcess::systemEnvironment();
ui->label_3->setText(env);
env = "text from SDK : " + QProcessEnvironment::systemEnvironment().value("activity_2_qt");
// QProcessEnvironment environment = QProcess::systemEnvironment();
ui->label_4->setText(env);
}
char * MainWindow::callndk()
{ char buf[100]; memset(buf,0,100);
QLibrary *hello_lib = NULL;
//写清楚库的路径,如果放在当前工程的目录下,路径为./libhello.so
//hello_lib = new QLibrary("lib://armeabi/libnative.so");
hello_lib = new QLibrary("/data/data/org.kde.necessitas.example.callso/lib/libnative.so");
//加载动态库
hello_lib->load();
if (!hello_lib->isLoaded())
{
printf("===================================load libnative.so failed!\n");
// ui->label->setText("fail to load so");
return 0;
}
//定义函数指针
typedef int (*Fun)();
//resolve得到库中函数地址
Fun hello = (Fun)hello_lib->resolve("testso");
int g=0;
if (hello)
{
g = hello();
}
sprintf(buf,"integer from ndk, value: %d",g);
ui->label_1->setText(buf);
//======================================================================
memset(buf,0,100);
char * bstr="..";
//定义函数指针
typedef char* (*FunS)();
//resolve得到库中函数地址
FunS getstr = (FunS)hello_lib->resolve("stringfromso");
if (getstr)
{
bstr = getstr();
}
sprintf(buf,"string from ndk, value: %s",bstr);
ui->label_2->setText(buf);
//卸载库
hello_lib->unload();
return bstr;
}