Android NDK编译学习
1、Hello_Jni学习
在android-ndk-r8\samples的目录下有大量的NDK的测试用例,只需要在Eclipse中导入,即可以使用。不过想要在Eclipse中编译JNI,当然得配置一些东西。
首先,JDK的安装是少不了的,安装好JDK后,配置好JDK的环境变量:
- 在系统变量里点击新建,变量名填写JAVA_HOME,变量值填写JDK的安装路径,在这里就填写“C:\Program Files\Java\jdk1.6.0_26”了。
- 在系统变量里点击新建变量名填写CLASSPATH,变量值填写“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”。注意不要忘记前面的点和中间的分号。
- 在系统变量里找到Path变量,这是系统自带的,不用新建。双击Path,由于原来的变量值已经存在,故应在已有的变量后加上“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”。注意前面的分号。
再次,下载SDK,配置好环境变量:
- ANDROID_SDK_HOME,变量值是android-SDK-windows的路径。
- Path变量,变量值方框里输入.;%ANDROID_SDK_HOME%\platform-tools;%ANDROID_SDK_HOME%\tools;
- 最后在cmd中运行adb命令。
最后,下载NDK。
安装Eclipse,导入android-ndk-r8\samples\hello-jni的例子:
在HelloJni的工程目录下,会看到一个JNI的目录,该目录就是放C代码和Android.mk的地方,也是NDK编译的主目录。该例子主要是Java调用一个JNI方法,获取一个字符串,并显示在TextView上。下面就需要配置Builder了。
- 在工程-->右键-->Properties-->Builders,New一个Builder出来
- 点击Browse File System选择ndk目录下的ndk-build.cmd;然后点击BrowseWorkspace选择工程。
- 选择Refesh,选择如下:
- 选择Build Options,勾选如下
- 选择Specify Resources,然后勾选需要编译的工程中的JNI目录。
- 然后保存,Eclipse就会自动去编译C代码了。最后会在libs-->armeabi目录下生成一个对应的.so库。
为了验证编译的.so是否可用,只需要在手机上run一把,如果首次链接手机,没有驱动,那么安装一个“豌豆荚”就可以了,当想要run的时候,一定要把豌豆荚给关了,在任务管理器中把豌豆荚的进程给干掉,因为它会占用adb,导致Eclipse链接不成功。
adb相关命令:adb kill-server adb start-server
2、NativeActivity测试用例
该例子是一个纯C代码的例子,调用egl相关api,改变屏幕的颜色。
android.mk配置:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-activity
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
android.xml配置:
修改AndroidMainfest.xml文件的内容为一下内容。唯一需要注意的就是<meta-data android:name="android.app.lib_name" android:value="droidblaster"/>标签中,value的值要和Android.mk 中的LOCAL_MODULE名称一致。
AndroidMainfest.xml的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.packtpub.droidblaster"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10"/>
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name="android.app.NativeActivity"
android:label="@string/app_name">
<meta-data android:name="android.app.lib_name"
android:value="droidblaster"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>