Linux环境下NDK JNI开发实例

今天搞了一天这个实例,也不是那么的容易,中间碰到很多的问题 

 

一,在windows下创建Test JNI工程

     步骤:

      1,在Eclipse中创建Android工程...(省略)

      2,添加一个简单的功能,显示Hello world!等,只要能执行成功就OK。

      3,cmd 进入终端 进入到你所在工程的目录下执行:

            javah -classpath bin\classes -d jni pcm.audio.play.PcmaudioplayActivity 

           产生.h文件。

           这条命令会在当前的工程目录下生成一个jni的文件夹和一个.h文件

            注意,执行此命令之前,工程一定是执行正常的,这样是保证了工程中的类,产生了相应的.class文件。这样才能生成.h文件

       3,在jni目录下,新建一个Android.mk文件

             其内容如下:

              LOCAL_ARM_MODE := arm
              LOCAL_PATH := $(call my-dir)
               include $(CLEAR_VARS)
               LOCAL_PRELINK_MODULE := false
               LOCAL_MODULE := ipodport_data
               LOCAL_SRC_FILES := ipodport_data.c
               include $(BUILD_SHARED_LIBRARY)

         4,在Jni目录下再新建一个.c文件 用于生成so文件

         5,在.c文件中添加刚才生成的.h文件

         到此,在windows下的工作应该做完了。

 

附: -----------------------------------------------

  windows java环境变量设置:

JAVA_HOME   C:\Program Files\Java\jdk1.6.0_26

PATH %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin

CLASSPATH  .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar

------------------------------------------------

下一步是进入Linux下完成的工作。

 

二,在Linux下NDK实例编译

   1,下载一个Linux版本的NDK包:

         提供如下Linux版下载地址:
 
        在Linux下随便如个目录解压,我在我的用户目录下新建一个文件夹NDK,然后把下载下来的包解压

       官方下载地址:(最新版本)

       http://developer.android.com/tools/sdk/ndk/index.html#download 

   2, 配置环境变量(配置NDKROOT及PATH环境变量)

      方法1:在shell 直接输入

                   export NDKROOT=/usr/local/android-sdk-linux_86/android-ndk-r4
                   export PATH=$PATH:$NDKROOT
      方法2:
              vim ~/.profile添加如下内容:
                   export NDKROOT=/usr/local/android-sdk-linux_86/android-ndk-r4
                   export PATH=$PATH:$NDKROOT
                  保存关闭后执行如下方法使之生效
                  最后执行:source ~/.profile
     3,创建工程目录
          mkdir -p $NDKROOT/apps/HelloNDK/project
        1)$NDKROOT/apps/HelloNDK --是NDK的工程目录
        2)$NDKROOT/apps/HelloNDK/project --是Android的工程目录
 
      4,把在window下创建的工程下的所有文件都Copy到 $NDKROOT/apps/HelloNDK/project/这个目录中。
            (我在windows下的工程目录是pcmaudioplay,是把这个目录下的所有文件拷到project这个目录中
 
      5,在$NDKROOT/apps/HelloNDK下创建一个Application.mk
            其内容:
            APP_PROJECT_PATH := $(call my-dir)/project
            APP_MODULES      := ipodport_data

            该文件时必须的,否则make无法编译

       6,进入$NDKROOT目录,记住一定在在这个目录下执行      

            make APP=HelloNDK
            在apps/HelloNDK/project/libs/armeabi下生成libipodport_data.so
 
            重新编译 make -B APP=HelloNDK

 

 三,用第三方的so,可以直接的使用

         方法:只是需要使用第三方用NDK开发的库,那么你只需要这样做:
                     把第三方提供的libxxx.so放到你的<project>/libs/armeabi/下, 然后在程序随便什么地方中加入
                 static {
                          System.loadLibray("xxx");
                }

 四,碰到的问题

     1,执行报错

make: Entering directory `/home/skypine2011/android-skypine/imx51-android'
Copy: out/target/product/generic/system/etc/apns-conf.xml
make: *** No rule to make target `/ipodport_data.c', needed by `out/target/product/generic/obj/SHARED_LIBRARIES/libipodport_data_intermediates/ipodport_data.o'.  Stop.
make: Leaving directory `/home/skypine2011/android-skypine/imx51-android'

 

     问题分析: 是Android.mk这个文件出了问题,还有和你的NDK环境没有配置好有关。按上面的错就没有错了。

 

    2,执行找不到编译工具

make: /home/skypine2011/android-skypine/imx51-android/ndk/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc: Command not found
make: Entering directory `/home/skypine2011/android-skypine/imx51-android/ndk/samples/two-libs'
Compile thumb  : twolib-second <= /home/skypine2011/android-skypine/imx51-android/ndk/samples/two-libs/jni/second.c
make: /home/skypine2011/android-skypine/imx51-android/ndk/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc: Command not found
make: *** [/home/skypine2011/android-skypine/imx51-android/ndk/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o] Error 127
make: Leaving directory `/home/skypine2011/android-skypine/imx51-android/ndk/samples/two-libs'
skypine2011@skypine:~/android-skypine/imx51-android/ndk$ ./ndk-build -C samples/pcmaudioplay/
Invalid attribute name: 
    package
make: /home/skypine2011/android-skypine/imx51-android/ndk/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc: Command not found
make: Entering directory `/home/skypine2011/android-skypine/imx51-android/ndk/samples/pcmaudioplay'
make: *** No rule to make target `/ipodport_data.c', needed by `/home/skypine2011/android-skypine/imx51-android/ndk/samples/pcmaudioplay/obj/local/armeabi/objs/ipodport_data/ipodport_data.o'.  Stop.
make: Leaving directory `/home/skypine2011/android-skypine/imx51-android/ndk/samples/pcmaudioplay'


         问题分析:

           我这是在android下的ndk下编译的,但是这个ndk没有包括编译工具的。按上面的操作就OK了。要从新下载ndk包就解决。

 

 

    3,编译出错:

        undefined reference to `__android_log_print'

       问题分析:找不到头文件,在Android.mk文件中添加一行:LOCAL_LDLIBS    := -llog  并在.c文件中添加"android/log"

 

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值