JNI需要注意事项

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预先注册查表法会更好。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值