ndk相关

来源:互联网 发布:沈阳i5数控编程实例 编辑:程序博客网 时间:2024/06/04 23:36

ndk相关

ndk编译so环境配置

1.下载安装cygwin,All->Devel其中包括gcc g++ make等
2.把NDK放到cygwin\home目录下
3.进入这个目录cygwin\home\Administrator对bash­_profile文件进行配置;
对该文件进行编辑,在文件最后添加如下命令后NDK=/cygdrive/c/cygwin/home/android-ndk-r7
4.源码进行编译 $NDK/ndk-build

5.生成头文件 javah -jni com.android.gl2jni.GL2JNILib


javah 使用(Javah生成JNI头文件)

C:/Users/archfree>javah 
用法:javah [选项] <类>

其中 [选项] 包括:

        -help                 输出此帮助消息并退出 
        -classpath <路径>     用于装入类的路径 
        -bootclasspath <路径> 用于装入引导类的路径 
        -d <目录>             输出目录 
        -o <文件>             输出文件(只能使用 -d 或 -o 中的一个) 
        -jni                  生成 JNI样式的头文件(默认) 
        -version              输出版本信息 
        -verbose              启用详细输出 
        -force                始终写入输出文件

使用全限定名称指定 <类>(例

首先先要编译我们的android项目,因为javah算是一个反编译工具,需对编译后的文件使用。由于我们编译后的文件是默认放在android项目目录下的bin目录的。于是我们打开cmd

cd C:\cygwin\home\AndroidJrtp\bin\classes

假设工程目录下有bin文件夹,bin存放编译好的class文件; 

在bin目录下,

进入项目目录下的bin目录然后输入

javah  -jni   MAndroidJrtp.Transport.LoadJrtp   (MAndroidJrtp.Transport为命名空间 LoadJrtp类名)

在jni目录下生成了:android_serialport_SerialPort.h

注:如生成失败可进入bin\classes目录


ndk-build出错,错误以及解决办法如下   

    用NDK编译jni目录下的文件了,我的系统是Ubuntu10.04,NDK版本是android-ndk-r7b。

       切换到工程的jni目录下执行:ndk-build(ndk-build的路径已经添加到系统路径了,如果没有添加,需要指定完整路径),直接报一下错误:

[html] view plaincopy
  1. Android NDK: There is no Android.mk under /home/helei/workspace/raydroid/jni/jni      
  2. Android NDK: If this is intentional  please define APP_BUILD_SCRIPT to point     
  3. Android NDK: to a valid NDK build script.      
  4. /home/helei/android_toolchain/android-ndk-r7b/build/core/add-application.mk:143: *** Android NDK: Aborting...    .  Stop.  
解决办法:修改jni目录下的Application.mk文件中:APP_PROJECT_PATH := $(call my-dir)这一行,将其修改为:APP_PROJECT_PATH := $(call my-dir)/..  。

       再次执行:ndk-build,得,错误又来了,如下:

[html] view plaincopy
  1. Android NDK: /home/helei/workspace/raydroid/jni/../jni/Android.mk:silkcommon: LOCAL_MODULE_FILENAME must not contain a file extension      
  2. /home/helei/android_toolchain/android-ndk-r7b/build/core/build-static-library.mk:29: *** Android NDK: Aborting    .  Stop.  
很明显在编译silkcommon这个静态库的时候出错了。

解决办法:打开jni目录下的Android.mk文件,在如下代码位置:

[html] view plaincopy
  1. SILK     :silk  
  2. LOCAL_MODULE    :silkcommon  
  3. LOCAL_SRC_FILES :=  $(SILK)/src/SKP_Silk_A2NLSF.c \  
  4.     $(SILK)/src/SKP_Silk_CNG.c \  
  5.     $(SILK)/src/SKP_Silk_HP_variable_cutoff_FIX.c \  

之前添加:include $(CLEAR_VARS), 修改之后为:

[html] view plaincopy
  1. include $(CLEAR_VARS)  
  2. SILK     :silk  
  3. LOCAL_MODULE    :silkcommon  
  4. LOCAL_SRC_FILES :=  $(SILK)/src/SKP_Silk_A2NLSF.c \  
  5.     $(SILK)/src/SKP_Silk_CNG.c \  

错误3

Compile++ thumb  : speex_jni <= speex_jni.cppH:/workspace/SipUA/jni/../jni/speex_jni.cpp:26:25: fatal error: speex/speex.h: No such file or directorycompilation terminated./cygdrive/h/android/android-ndk-r8/build/core/build-binary.mk:255: recipe for target `/cygdrive/h/workspace/SipUA/obj/local/armeabi/objs/speex_jni/speex_jni.o' failedmake: *** [/cygdrive/h/workspace/SipUA/obj/local/armeabi/objs/speex_jni/speex_jni.o] Error 1



解决办法:把jni文件夹中的speex-1.2rc1/include/speex文件夹拷贝到jni目录下

ndk-build编译成功~~~~