1、 System.loadLibrary("xxx"); 注意库的命名规则是libxxx.so
2、加载库和本地方法尽量写成一个类:
public class RecordJNI {
public native int StartRecord(String path);
static{
System.loadLibrary("RecordJNI");
}
}
3、被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。一般的jni文件都是cpp格式,要调用C语言的函数或库,在extern “C”里声明要调用的函数。
4、底层有死循环或不能及时返回JNI,一定要记得用线程!!否则界面没有反应。
每次调用完这个函数便会销毁线程:
public void _OpenThread(){
new Thread() {
public void run() {
RecordJNI rjni1 = new RecordJNI();
int i=rjni1.StartRecord(sta);
if(i==0) Log.e(LOG_TAG,"record success!");
}
}.start();}
5、在源码编译JNI文件夹,apk的根目录Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME :=xxx
LOCAL_JNI_SHARED_LIBRARIES := libxxx
include $(BUILD_PACKAGE)
include $(LOCAL_PATH)/jni/Android.mk
LOCAL_PREBUILT_JAVA_LIBRARIES := pinyin4j-2.5.0:libs/pinyin4j-2.5.0.jar
include $(BUILD_MULTI_PREBUILT)
#libxxx 便被打包到apk里面了, 注意LOCAL_MODULE_TAGS要和jni的Android.mk里的一致。同时还可以添加jar、so的预编译。
6、eclipse打包库到APK:工程下新建libs/armeabi(有些是libs/armeabi-v7a)/,下面放入NDK编译好的so库,注意库的命名libxxx.so。然后运行便可生成带lib的APK了。
7、JNI有java JNI和android JNI两种,根据所需选取,java JNI写起来快一点,但是查找效率低,每次调用JNI库都需逐一寻找包名+函数名。如果是大量的本地调用,用android JNI的JNINativeMethod预先注册查表法会更好。