`
k_lb
  • 浏览: 837979 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

用C/C++开发android应用

 
阅读更多

在某些情况下,比如原来与很多c/c++的代码, 可能希望采用c/c++编写android应用程序.在这种情况下,一般使用NDK.但是由于android直提供了java接口,因此不能够直接调用android中的各种对象或者部件. 如何直接使用c/c++开发android应用? 可以使用cle和wrapandroid项目作为中间件. CLE项目提供了多种语言的通用接口,其中就包含对c/c++的支持.


本文简单介绍了如何使用CLE和wrapandroid编写GUI应用程序。CLE可以作为多种语言的通用平台,支持java, python,c/c++,lua, 等,且可以扩展至其它多种语言,也可以自定义语言。在CLE中,对象作为1个基本的操作元素。对象对外提供了统一的接口,可以通过这些接口,调用对象的函数,重载对象的函数,捕获对象的事件.

Wrapandroid将android类封装成为CLE对象,从而可以使程序员在c/c++中使用android的类。一般有以下几个步骤:
1.使用CLE接口函数MallocObjectL创建android类的实例对象
2.使用ScriptCall接口函数调用对象的方法
3.使用CreateOvlFunction重载对象的函数
4.使用RegEventFunction注册对象的事件处理函数

步骤1: 准备环境

a: CLE可以在应用启动的时候自动安装,只需要在工程中包含starcore_android_r6.jar,该文件在starcore_devfiles_r6.zip压缩包中, 可以从链接:http://code.google.com/p/cle-for-android 下载。

b: Wrapandroid是一个jar库,可以从http:/code.google.com/p/wrapandroid-for-multilaguage/download/wrapandroid_devfiles_0_8_5.rar下载。

步骤2 : 开始编程


开发工具使用eclipse和NDK. 这两个如何安装和使用,请参阅相关的文档.

a. 打开eclipse, 创建一个新工程,名字为“introduction”

b. cle可以在应用启动的时候从网络下载,此时需要在工程中增加以下许可:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

c. 将java库文件starcore_android_r6.jar和wrapandroid.jar拷贝到工程目录,并加入到工程中:



d. 编辑IntroductionActivity.java,如下修改,装载共享库
import com.srplab.wrapandroid.*;
public class IntroductionActivity extends WrapAndroidActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
StarActivity._Call("DoFile","","/data/data/"+getPackageName()+"/lib/libCode.so");
}
}
e cle也可以打包到工程中,此时需要将CLE的共享库文件放到工程目录中,如下:


同时,将下载标志设置为false
public class IntroductionActivity extends WrapAndroidActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
DownloadFromNetFlag = false;
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
StarActivity._Call("DoFile","","/data/data/"+getPackageName()+"/lib/libCode.so");
}
}
f. 编辑布局文件:main.xml.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget73"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/widget45"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:id="@+id/widget74"
android:layout_width="220dp"
android:layout_height="48dp"
android:text="thank for your use"
android:typeface="serif"
android:textStyle="bold"
android:textColor="#ffff0000"
android:layout_x="284dp"
android:layout_y="220dp"
android:textSize="16dp"
/>
</LinearLayout>

g. 在工程目录下,创建jni目录, 将wrap android和cle头文件拷贝到该目录下. 创建新文件code.cpp. and Android.mk, 编辑Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and sourcefile(s)
LOCAL_CFLAGS += -Wno-write-strings -DENV_ANDROID
LOCAL_CPPFLAGS += -Wno-write-strings -fexceptions -DENV_ANDROID
LOCAL_LDFLAGS += -Wno-write-strings -DENV_ANDROID
LOCAL_C_INCLUDES += cle_files/include
#--------source file
MODULE_CXXSRCS := Code.cpp SRPWrapAndroidEngine_UUIDDef.cpp
LOCAL_SRC_FILES := ${MODULE_CXXSRCS}
LOCAL_LDLIBS := cle_files/libs/armeabi/libstarlib.a
LOCAL_MODULE := Code
include $(BUILD_SHARED_LIBRARY)

#------------------------
include $(CLEAR_VARS)
LOCAL_SRC_FILES := cle_files/so/armeabi/libstarcore.so
LOCAL_MODULE := starcore
include $(PREBUILT_SHARED_LIBRARY)
#------------------------
include $(CLEAR_VARS)
LOCAL_SRC_FILES := cle_files/so/armeabi/libstar_java.so
LOCAL_MODULE := star_java
include $(PREBUILT_SHARED_LIBRARY)

步骤3. Code.cpp

采用原生代码编写android应用,需要将其编译成为共享库。共享库输出两个接口函数:
VS_BOOL StarCoreService_Init(class ClassOfStarCore *starcore)
void StarCoreService_Term(class ClassOfStarCore *starcore)

第一个函数在共享库装载的时候调用,可以进行一些初始化工作;第二个函数在共享库卸载的时候调用

代码如下:
//--wrap android头文件
#include "SRPWrapAndroidEngine_VSClass.h"

//--服务接口,其它所有函数都通过该接口调用.
static class ClassOfSRPInterface *SRPInterface;
//--android Activity对象,由java代码创建.
static void *StarActivity;

//--按钮的事件函数。 事件函数的处理原型都相同.
static VS_INT32 MyButton_onClick(VS_ULONG FunctionChoice,void *EventPara)
{
//--当事件被触发时,显示一些信息.
//--创建toast对象。
void *toast = SRPInterface->MallocObjectL(&VSOBJID_ToastClass,0,NULL);
//--调用toast的函数“makeText”, (si) 为输入参数的类型,详细解释需要参阅CLE文档.
SRPInterface -> ScriptCall(toast,NULL,"makeText","(si)","Button is click", 0);
//--调用toast的函数“show”
SRPInterface -> ScriptCall(toast,NULL,"show","()");
return 0;
}
static VS_INT32 MyButton1_onClick(VS_ULONG FunctionChoice,void *EventPara)
{
void *toast = SRPInterface->MallocObjectL(&VSOBJID_ToastClass,0,NULL);
SRPInterface -> ScriptCall(toast,NULL,"makeText","(si)","Button is click", 0);
SRPInterface -> ScriptCall(toast,NULL,"show","()");
return 0;
}

//--共享库的初始化函数
VS_BOOL StarCoreService_Init(class ClassOfStarCore *starcore)
{
class ClassOfBasicSRPInterface *BasicSRPInterface;
//--获取基本服务接口
BasicSRPInterface = starcore ->GetBasicInterface();
//---获取当前的服务接口,服务由java代码创建
SRPInterface = BasicSRPInterface ->GetSRPInterface(BasicSRPInterface->QueryActiveService(NULL),"","");
void *ActivityClass;
//---获取被封装的acvitity类
ActivityClass = SRPInterface -> GetObjectEx(NULL,"ActivityClass");
//--调用getCurrent function获取当前的activity, 由java代码创建. ()O 表示返回值为一个cle对象
StarActivity = (void *)SRPInterface -> ScriptCall(ActivityClass,NULL,"getCurrent","()O");
//--打印一些信息,打印的信息会显示到logcat中.
SRPInterface -> Print("Get Main Activity = %s", SRPInterface -> GetName(StarActivity));
//--调用activity的函数getResource获取布局中定义的资源的ID.输入参数为字符串,输出为整数,使用标记为(s)I.
int widget45 = SRPInterface -> ScriptCall(StarActivity,NULL,"getResource","(s)i","id/widget45");
//--调用findViewById函数获取textview. 该函数与android的函数原型略为不同,输入参数中增加的类的名称。
void *MyText = (void *)SRPInterface -> ScriptCall(StarActivity,NULL,"findViewById","(si)o","TextViewClass",widget45);
//--调用textview的函数setText。
SRPInterface -> ScriptCall(MyText,NULL,"setText","(s)","TextViewClass","from layout");
int widget74 = SRPInterface -> ScriptCall(StarActivity,NULL,"getResource","(s)i","id/widget74");
//--调用findViewById获取按钮对象
void *MyButton = (void *)SRPInterface -> ScriptCall(StarActivity,NULL,"findViewById","(si)o","ButtonClass",widget74);
//--调用按钮对象的setText.
SRPInterface -> ScriptCall(MyButton,NULL,"setText","(s)","click me");
//--调用按钮对象的函数setOnClickListener.
SRPInterface -> ScriptCall(MyButton,NULL,"setOnClickListener","()");
//--注册事件的处理函数
SRPInterface -> RegEventFunction(MyButton,&VSOUTEVENTID_ViewClass_onClick,MyButton,(void *)MyButton_onClick,0);
int widget73 = SRPInterface -> ScriptCall(StarActivity,NULL,"getResource","(s)i","id/widget73");
//--调用findViewById获取LinearLayout.
void *MyLinearLayout = (void *)SRPInterface -> ScriptCall(StarActivity,NULL,"findViewById","(si)o","LinearLayoutClass",widget73);
//--动态创建按钮对象,是linearlayout的子对象
void *MyDynaButton = SRPInterface->MallocObject(MyLinearLayout,VSATTRINDEX_VIEWGROUPCLASS_VIEWQUEUE,&VSOBJID_ButtonClass,0,NULL);
SRPInterface -> ScriptCall(MyDynaButton,NULL,"setText","(s)","created dynamically");
SRPInterface -> ScriptCall(MyDynaButton,NULL,"setOnClickListener","()");
SRPInterface -> RegEventFunction(MyDynaButton,&VSOUTEVENTID_ViewClass_onClick,MyDynaButton,(void *)MyButton1_onClick,0);
//--设置布局参数
SRPInterface -> ScriptCall(MyDynaButton,NULL,"setLinearLayoutParams","(ii)",100,50);
return VS_TRUE;
}
void StarCoreService_Term(class ClassOfStarCore *starcore)
{
SRPInterface -> Release();
return;
}

Step 4. 使用ndk编译成为共享库


运行结果



例子下载:

http://wrapandroid-for-multilanguage.googlecode.com/svn/wiki/examples/c_introduction.zip

分享到:
评论

相关推荐

    Android将允许纯C:C++开发应用

    虽然长期以来,Android应用程序的主要开发语言是Java(以及后来的Kotlin),但Android一直通过Java Native Interface (JNI)等机制支持部分C/C++代码的集成。然而,此次更新意味着Android将允许开发者完全使用C/C++来...

    c/c++Android开发环境配置

    完成以上步骤后,开发者便可以在Android设备或模拟器上测试和运行C/C++代码编译的原生库和Java代码混合的Android应用程序。这个过程涉及到Android原生开发的各个环节,包括编译环境的配置、源码的编写、构建流程以及...

    基于linux C/C++和android的酒店终端管理系统

    总结来说,基于Linux C/C++和Android的酒店终端管理系统是一个典型的跨平台、分布式应用实例,涉及到了服务器端开发、移动客户端开发以及网络通信等多个技术领域。理解并掌握这些知识点,对于开发者来说,不仅能提升...

    Android Binder C/C++层实现示例

    虽然Java Binder是Android应用开发者更常见的API,但C/C++ Binder提供了更低层次的访问,可以实现更高效、更灵活的进程间通信。Java Binder是C/C++ Binder的封装,提供了面向对象的接口,简化了开发流程,但在性能和...

    android C/C++程序

    在IT行业中,尤其是在移动开发领域,Android应用的性能优化经常涉及到C/C++代码的使用,这就是所谓的Android C/C++程序。这种编程方式可以利用Native层的高效计算能力,提高应用程序的运行速度,尤其是在处理图形、...

    Android JNI开发入门之C/C++实现示例程序

    Android应用程序(APK)怎样通过JNI调用Native C/C++实现的共享库。Android系统的Java虚拟机为C和C++实现两套不同的API,本工程分别对其作出示例程序。并编译出libhelloworld.so/libhelloworldcpp.so共享库

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    在Android开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C/C++语言编写部分或全部应用程序,以实现高性能计算或者利用已有的C/C++库。本项目是一个关于Android NDK入门的实例,展示了...

    ndk源码基于eclipse开发c/c++/java

    NDK是一组工具,用于在Android平台上编译C和C++代码,生成原生库,这些库可以直接被Android应用程序(APK)中的Java代码调用。NDK的主要用途包括:提升性能、使用已有的C/C++库、以及处理CPU密集型任务,如图形处理...

    Android JNI 断点调试C++

    1. 安装Android Studio,确保版本支持C++开发和NDK。 2. 创建一个新的Android项目,选择“Include C++ support”模板,或者在已有的项目中添加C++支持。 3. 在app的build.gradle文件中,配置NDK路径和ABI支持,例如...

    Android app调用C/C++方法

    在Android应用开发中,有时我们需要利用C或C++的高性能特性来处理一些计算密集型任务或者调用已有的C库。这种情况下,Android的JNI(Java Native Interface)框架提供了调用C/C++代码的能力。本篇文章将深入探讨如何...

    Android调用C/C++(NDK)

    NDK是一组工具,允许开发者在Android应用中使用原生代码,即C和C++,并将其编译为本地机器码,从而提升性能。 1. **NDK概述** - NDK提供了一系列的交叉编译工具,使得开发者可以在非Android设备上编译出能在...

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码

    在Android应用开发中,Cocos2d-x是一个广泛使用的开源游戏引擎,它允许开发者使用C++编写游戏逻辑,同时提供了与Java交互的能力。本主题聚焦于如何通过JNI(Java Native Interface)来实现在Cocos2d-x中调用Java层的...

    android studio项目java C/C++ 相互调用

    在Android开发中,有时我们需要利用C或C++的高性能...通过以上步骤和知识点,开发者可以充分利用Java和C/C++的优点,为Android应用开发带来更高的性能和灵活性。在实际项目中,理解并熟练掌握这些技术是非常重要的。

    Android项目下使用JNI进行C/C++和Java互相调用

    本项目演示了如何在Android应用中使用JNI,实现C/C++与Java的双向调用。以下是关于这个主题的详细讲解。 1. JNI基础: JNI是Java平台的标准组成部分,它提供了一套接口,让Java代码能够调用本地(非Java)代码,并...

    Android_C、C++_开发

    在Android平台上,C和C++语言的开发是高级开发者常用的技术,它们被用来提升应用程序的性能,尤其是在处理图形计算、...通过深入阅读和实践,你将能够掌握Android平台上使用C/C++开发的技能,提升你的应用开发能力。

    C/C++/Java/android/PHP/iOS/Python期末试卷.rar

    开发Android应用主要使用Java或Kotlin语言。 关键概念: 1. Android SDK:开发者工具集,包括编译器、模拟器、调试工具等。 2. Activity:应用程序的基本组件,负责用户界面。 3. Intent:用于启动其他组件或传递...

    android上安装c/c++编译环境

    在Android平台上进行C/C++开发,需要搭建一个合适的编译环境。...完成以上步骤后,你就可以在Android设备上进行C/C++开发,利用NDK将本地代码集成到Android应用中,或者独立地编写和运行原生程序。

    Android NDK C/C++ 简单样例

    在Android开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C和C++编写原生代码,并将其集成到Android应用中。这个"Android NDK C/C++ 简单样例"是为初学者设计的,旨在帮助他们理解如何...

    Android 调用C++代码和C++代码调用源码.zip

    在Android应用开发中,有时我们需要利用C++代码来实现高性能计算、访问硬件或者利用已有的C++库。这种跨语言的交互技术被称为JNI(Java Native Interface)。本项目提供了Android调用C++代码以及C++代码调用Java源码...

    Android C++高级编程 使用NDK

    《Android C++高级编程:使用NDK》是一本专注于探讨如何在Android平台上进行C++开发的专业书籍。Android NDK(Native Development Kit)是Google提供的一个工具集,它允许开发者使用原生代码(如C和C++)来编写部分...

Global site tag (gtag.js) - Google Analytics