生成android手机上使用的so库

    so库是分平台的,android手机用的是arm芯片,所以用gcc编译so库时需要用ndk中的arm-linux-androideabi-gcc来生成,才可以用于android手机。

    首先,在android官网上下载ndk。

    解压后,进入android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin目录,会发现所有gcc支持的交叉编译的命令。

    编译命令示例如下:

./arm-linux-androideabi-gcc /home/ting/workspace/test/com_example_test_jni_JniKey.c -I ../../../../../platforms/android-18/arch-arm/usr/include/ -L ../../../../../platforms/android-18/arch-arm/usr/lib/ -fPIC -shared -o libkey.so

    其中,./arm-linux-androideabi-gcc是编译命令;

             -I指明了需要使用的jni.h等头文件所在的目录;

             -L指明了需要使用的so库所在的目录;

    除此之外,用如上命令执行会说找不到crtbegin_so.o和crtend_so.o这两个文件,因为他们是静态文件,所以在ndk目录下搜索到这两个文件,将其copy到当前路径,就ok了。

    android工程中的so库需要放在libs/armeabi目录下,才会被应用程序检测到。

在android代码中使用如下代码加载so库。

 static {
        System.loadLibrary("key");
    }
其中,需要注意的是,比如动态链接库的名字是libkey.so,在代码中加载时要加载的名称是key。即去掉前面的lib和后面的.so。

另外,so库中的jni相应代码的函数名是Java_包名_类名_函数名,因此必须和相应包的相应类相对应,否则会找不到native方法。

你可能感兴趣的:(NDK,so)