Android源代码之C/C++语言开发

本文以Sqlite为例,说明Android怎样集成了C语言开发的库。

 

即使将来Android大行其道,我想也不会是像大家想的这么简单,找几个人弄一下就好了。

要想更好的满足用户需求,扩展现有的功能,使用C语言开发是避免不了的,否则就只能跟在别人的后面。

从第一次听说Android开始就想着怎样使用C语言进行开发。毕竟和硬件打交道的这部分代码一定需要使用C语言。

Android现在是基于Linux,Linux的进程和线程这些也必须使用C语言。有了Android的源代码,终于可以看到冰山一角了。

 

主要以下面的几个文件的代码为例子说明:

~dalvik/libcore/sql/src/main/java/sqlite/Database.java

dalvik/libcore/sql/src/main/native/Sqlite_jni.c,Sqlite_jin_registration.c

另外在frameworks也有一些,都是类似的,这里也列在这里,

frameworks/base/core/java/android/database/sqlite: SQLiteDatabase.java

frameworks/base/core/jni android_database_SQLiteDatabase.cpp

 

首先看Database.java第34,35两行:

    private native void _open(String filename, int mode)
    throws SQLite.Exception;

这里只有一个定义使用private native定义。

在Sqlite_jni.h中有定义函数并在Sqlite_jni.c中实现:

JNIEXPORT void JNICALL Java_SQLite_Database__1open
  (JNIEnv *, jobject, jstring, jint);

注意在C语言中的函数最后两个参数和在JAVA文件中的类型类似都是一个String和int类型。

然后在Sqlite_jni_registration.c中定义JNI接口

static JNINativeMethod sqliteDatabaseMethods[] = {
    /* name, signature, funcPtr */
/* Header for class SQLite_Database */
{ "_open", "(Ljava/lang/String;I)V", Java_SQLite_Database__1open},

........

并通过下面的函数注册:

int register_SQLite_Database(JNIEnv* env) {
    return jniRegisterNativeMethods(env, "SQLite/Database",
        sqliteDatabaseMethods, NELEM(sqliteDatabaseMethods));
}

 

在frameworks下面的两个文件类似,不过没有头文件,是直接注册的,与上面的代码相似。

由此可以看出进行C语言开发需要以下几个步骤:

1.编写Native.java,并将你希望使用C语言实现的方法声明为private native,并编译成Native.class

2.使用javah工具生成C语言使用的头文件:javah -classpath pathtoNative.class/Native.这个文件是使用工具生成的不要修改,如果出错,建议重新生成

3.实现C语言的函数,并使用交叉编译器编译,链接成动态库,这部分是C程序员熟悉的

4.撰写注册函数,并将C语言的实现像Android的源代码那样注册给JVM,工在运行时调用

 

当然这之后包含两方面的扩展,一个是使用java,一个使用C语言。在设计时要权衡个方面来决定使用那种语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值