Android JNI开发入门之一
2010-12-18 08:04:01 来源:WEB开发网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)
赞助商链接