。如果这里写的不正确或者参数不正确整个库的引导就会报异常。TextViewtv=newTextView(this);tv.setText(stringFromJNI());//如果调用失败会抛出java.lang.UnsatisfiedLinkError异常setContentView(tv);}//注意下面的native关键字publicnativeStringpublicnativeStringstatic{System.loadLibrary("hello-jni");//导入hello-jni库
-2-
stringFromJNI();unimplementedStringFromJNI();
}
}因为这里会出很多的异常所以如果你不希望调用ndk的时候抛出异常影响java层用户体验你可以将native函数再封装一层然后捕获异常例如:
try{result=nativeDecrypt(crypedFileName,decryptedFileName,passwd);}catch(finalUnsatisfiedLinkErrorue){Constant.LOG("decryptUnsatisfiedLinkError");}catch(finalExceptione){Constant.LOG("decryptException");}returnresult;}
导入库的地方也可以封装:
static{try{System.load("/data/data/com.app.email/lib/libtest.so");System.load("/data/data/com.app.emai/lib/libdecrypt.so");}catch(SecurityExceptionse){Constant.LOG("System.loadSecurityException");}catch(Exceptione){Constant.LOG("System.loadException");
-3-
}}
关于ndk如何编写可以参考Sun的Java本地接口(JNI)规范
下面贴出几每
常用的编写方式如下:示例1--传递参数在第一个示例中,我们将三个常用参数类型传递给本地函数:String、int和boolean。本例说明在本地C代码中如何引用这些参数。publicclassMyNative{publicvoidshowParms(Strings,inti,booleanb){showParms0(s,i,b);}privatenativevoidshowParms0(Strings,inti,booleanb);static{System.loadLibrary("MyNative");}}
请注意,本地方法被声明为专用的,并创建了一个包装方法用于公用目的。这进一步将本地方法同代码的其余部分隔离开来,从而允许针对所需的平台对它进行优化。static子句加载包含本地方法实现的DLL。下一步是生成C代码来实现showParms0方法。此方法的C函数原型是通过对.class文件使用javah实用程序来创建的,而.class文件是通过编译MyNative.java文件生成的。这个实用程序可在JDK中找到。下面是javah的用法:javacMyNative.java(将.java编译为.class)javah-jniMyNative(生成.h文件)
这将生成一个MyNative.h文件,其中包含一个本地方法原型,如下所示:
-4-
/**Class:*Method:*/JNIEXPORTvoidJNICALLJava_MyNative_showParms0(JNIEnv*,jobject,jstring,jint,jboolean);MyNativeshowParms0
*Signature:(Ljava/lang/String;IZ)V
第一个参数是调用JNI方法时使用的JNIEnvironment指针。第二个参数是指向在此Java代码中实例化的Java对象MyNative的一个句柄。其他参数是方法本身的参数。请注意,MyNative.h包括头文件jni.h。jni.h包含JNIAPI和变量类型(包括jobject、jstring、jint、jboolean,等等)的原型和其他声明。本地方法是在文件MyNative.c中用C语言实现的:#include
#include"MyNative.h"JNIEXPORTvoidJNICALLJava_MyNative_showParms0(JNIEnv*env,jobjectobj,jstrings,jinti,jbooleanb){constchar*szStr=(*env)->GetStringUTFChars(env,s,0);printf("String=[%s]\n",szStr);printf("int=%d\n",i);printf("boolean=%s\n",(b==JNI_TRUE?"true":"false"));(*env)->ReleaseStringUTFChars(env,s,szStr);}
JNIAPI,GetStringUTFChars,用来根据Java字符串或jstring参数创建C字符串。这是必需的,因为在本地代码中不能直接读取Java字符串,而必须将其转换为C字符串或Unicode。有关转换Java字符串的详细信息,请参阅标题为NLSStringsandJNI的一篇论文。但是,jbo