WEB开发网
开发学院手机开发Android 开发 Android JNI开发入门之一 阅读

Android JNI开发入门之一

 2010-12-18 08:04:01 来源:WEB开发网   
核心提示:Log.d(TAG, "Activity call JNI: " + printJNI());}}这个HelloWorld Activity非常简单,只是调用JNI接口printJNI()打印一些信息到Android logger上面,Android JNI开发入门之一(2),我们需要关注一下的是p

Log.d(TAG, "Activity call JNI: " + printJNI());

}

}

这个HelloWorld Activity非常简单,只是调用JNI接口printJNI()打印一些信息到Android logger上面。我们需要关注一下的是printJNI()的声明,有一个native的关键字,说明他是一个用native代码实现的函数,需要用 JNI调用Native代码。另外注意static代码段,这段代码意思是当类HelloWorld第一次被加载的时候,加载 libhelloworld.so(请注意这里写的是库名称,在Linux中共享库名为xxx共享库,文件存在形式为libxxx.so。所以 loadLibrary的参数不是libhelloworld.so,而是helloworld。如果写错误了将会加载库失败,将会收到异常)。

C语言实现helloworld共享库

接下来我们需要来完成Native 代码部分了,这里需要强调一下,Android JNI实现中为C/C++提供了两套不同的API,调用的时候需要注意,否则非常有可能你会受到一些libc库的崩溃信息,没准儿会把你整“崩溃”,呵 呵!下面先实现Native C来实现helloworld库。

如果你对Java标准JNI熟悉的话,肯定知道javah工具,可以根据java源程序,生成Native代码的头文件(可以参考我的博文《Linux下JNI实现》)。如果你是在Eclipse中开发apk的话,可以在打开终端进入bin目录,然后执行:

javah com.simon.HelloWorld

你将会得到,一个头文件com_simon_Helloworld.h,这里包含有printJNI接口的C/C++声明。这个声明肯定正确,如果你把printJNI接口声明写错了,HelloWorld将找不到printJNI接口,然后产生崩溃。

我们创建com_simon_Helloworld.c文件,并在该文件中输入:

#include

#define LOG_TAG "HelloWorld"

#include

/* Native interface, it will be call in java code */

JNIEXPORT jstring JNICALL Java_com_simon_HelloWorld_printJNI(JNIEnv *env, jobject obj)

{

LOGI("Hello World From libhelloworld.so!");

return (*env)->NewStringUTF(env, "Hello World!");

}

/* This function will be call when the library first be load.

* You can do some init in the libray. return which version jni it support.

*/

jint JNI_OnLoad(JavaVM* vm, void* reserved)

Tags:Android JNI 开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接