轉自 http://blog.csdn.net/xiangjai/article/details/8712034
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的路徑已經添加到系統路徑了,如果沒有添加,需要指定完整路徑),直接報一下錯誤:
- Android NDK: There is no Android.mk under /home/helei/workspace/raydroid/jni/jni
- Android NDK: If this is intentional please define APP_BUILD_SCRIPT to point
- Android NDK: to a valid NDK build script.
- /home/helei/android_toolchain/android-ndk-r7b/build/core/add-application.mk:143: *** Android NDK: Aborting... . Stop.
再次執行:ndk-build,得,錯誤又來了,如下:
- Android NDK: /home/helei/workspace/raydroid/jni/../jni/Android.mk:silkcommon: LOCAL_MODULE_FILENAME must not contain a file extension
- /home/helei/android_toolchain/android-ndk-r7b/build/core/build-static-library.mk:29: *** Android NDK: Aborting . Stop.
解決辦法:打開jni目錄下的Android.mk文件,在如下代碼位置:
- SILK := silk
- LOCAL_MODULE := silkcommon
- LOCAL_SRC_FILES := $(SILK)/src/SKP_Silk_A2NLSF.c \
- $(SILK)/src/SKP_Silk_CNG.c \
- $(SILK)/src/SKP_Silk_HP_variable_cutoff_FIX.c \
之前添加:include $(CLEAR_VARS), 修改之後爲:
- include $(CLEAR_VARS)
- SILK := silk
- LOCAL_MODULE := silkcommon
- LOCAL_SRC_FILES := $(SILK)/src/SKP_Silk_A2NLSF.c \
- $(SILK)/src/SKP_Silk_CNG.c \
錯誤3
- Compile++ thumb : speex_jni <= speex_jni.cpp
- H:/workspace/SipUA/jni/../jni/speex_jni.cpp:26:25: fatal error: speex/speex.h: No such file or directory
- compilation 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' failed
- make: *** [/cygdrive/h/workspace/SipUA/obj/local/armeabi/objs/speex_jni/speex_jni.o] Error 1
解決辦法:把jni文件夾中的speex-1.2rc1/include/speex文件夾拷貝到jni目錄下
ndk-build編譯成功~~~~