今天搞了一天这个实例,也不是那么的容易,中间碰到很多的问题
一,在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包:
官方下载地址:(最新版本)
http://developer.android.com/tools/sdk/ndk/index.html#download
2, 配置环境变量(配置NDKROOT及PATH环境变量)
方法1:在shell 直接输入
APP_MODULES := ipodport_data
该文件时必须的,否则make无法编译
6,进入$NDKROOT目录,记住一定在在这个目录下执行
三,用第三方的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"