Android JNI开发入门之二
2010-12-18 08:04:03 来源:WEB开发网在上一篇文章《Android JNI开发入门之一》中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库。本文将进一步介绍Android应用程序通过JNI调用Native C++实现的共享库,并实现一个和上文《Android JNI开发入门之一》相同功能的Helloworld应用程序。
两套不同的API
前文已经提到,Android系统的Java虚拟机为C和C++实现两套不同的API,所以我们调用的时候需要注意这一点儿。另外Google 并没有提供JNI的文档,我们调用的时候可以参考Android的jni.h文件,里面有C和C++的JNI函数原型。也可以把本例的相同功能 HelloWorld库和上文《Android JNI开发入门之一》进行比较。
C++实现HelloWorld共享库
在本例中Android应用程序不需要有任何变化,我们需要重新用C++实现HelloWorld共享库。创建com_simon_Helloworld.cpp文件,并在文件中输入如下内容:
#include
#define LOG_TAG "HelloWorld"
#include
/*
* Class: com_simon_Helloworld
* Method: print
* Signature: ()V
*/
/*JNIEXPORT void JNICALL Java_com_simon_Helloworld_print(JNIEnv *, jobject)*/
JNIEXPORT jstring JNICALL Java_com_simon_HelloWorld_printJNI(JNIEnv *env, jobject obj)
{
LOGI("Hello World From libhelloworld.so!");
return env->NewStringUTF("Hello World!");
}
static const char *classPathName = "com/simon/HelloWorld";
static JNINativeMethod methods[] = {
{"printJNI", "()Ljava/lang/String;", (void*)Java_com_simon_HelloWorld_printJNI },
};
/*
* Register several native methods for one class.
*/
static int registerNativeMethods(JNIEnv* env, const char* className,
JNINativeMethod* gMethods, int numMethods)
{
jclass clazz;
clazz = env->FindClass(className);
if (clazz == NULL) {
LOGE("Native registration unable to find class '%s'", className);
return JNI_FALSE;
赞助商链接