Android-JNI开发环境 (windows10+ubuntu16.04)
系统环境
* windows10(64位)
* Ubuntu16.04(32位)
* 相关安装包:jdk-8u131-linux-i586.tar.gz、android-sdk_r24.4.1-linux.tgz、android-ndk-r8b-Linux-x86.tar.bz2
* 安装包下载链接
1.安装JDK (Ubuntu)
- 下载jdk:jdk-8u131-linux-i586.tar.gz
- 解压:sudo tar -zxvf jdk-8u101-linux-x64.tar.gz
- 移动到指定文件夹:sudo mv /jdkjdk1.8.0_101 /usr/java
- 设置环境变量,vim ~/.bashrc,在最后添加:
JAVA_HOME=/usr/java/jdk1.8.0_131
JRE_HOME=$JAVA_HOME/jre
JAVA_BIN=$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME PATH CLASSPATH
- 使得环境变量生效:source ~/.bashrc
- 验证:java -version,打印java信息,如果没有反应,尝试关闭当前终端,或者重启
2.安装NDK (Ubuntu)
- 下载nkd:android-ndk-r8b-Linux-x86.tar.bz2
- 解压:tar -jxvf android-ndk-r8b-Linux-x86.tar.bz2
- 移动到指定文件夹:sudo mv android-ndk-r8b /usr/local/ndk
- 设置环境变量,vim ~/.bashrc,在最后添加:
NDK_HOME=/usr/local/ndk/android-ndk-r8b
export NDK_HOME
export PATH=$PATH:$NDK_HOME
- 使得环境变量生效:source ~/.bashrc
- 验证:ndk-build,打印ndk信息,如果没有反应,尝试关闭当前终端,或者重启
3.安装sdk (ubuntu) 【注:Ubuntu中仅仅安装SDK】
- 下载:android-sdk_r24.4.1-linux.tgz
- 解压:tar -zxvf android-sdk_r24.4.1-linux.tgz
- 移动到指定文件夹:sudo mv android-sdk-linux /opt
- 设置环境变量,vim ~/.bashrc,在最后添加:
ANDROID_HOME=/opt/android-sdk-linux
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform:$ANDROID_HOME/platform_tools
- 使得环境变量生效:source ~/.bashrc
- 验证:android,弹出Android SDK Manager的对话框,如果不行,尝试重启
- 选择下载相关文件
Android SDK Tools 24.4.1
Android SDK Platform-tools 25.0.6
Android SDK Build-tools 24.0.3
Android6.0文件夹中:SDK Platform 23、Google APIs、Sources for Android SDk
//注:这里主要下载Android6.0的文件,电脑容量大网速快的话可以都下载。Image文件主要用于模拟器,相对较大,如果不用模拟器的话不用下载,
4.安装adb (Ubuntu)
- sudo apt install android-tools-adb
- 需要用到的命令:
adb devices // 查看电脑连接的安卓设备,插上设备后,执行这个命令,能够list相关设备
adb root // 获取root权限
adb shell // 进入安卓设备的shell环境,进去后可输入linux支持的命令
adb remount // 将设备设为可读可写
adb push ~\drivers\hello.ko data/fpga // 需要拷贝到能够读写的文件夹
- 打开手机的开发者选项,勾选USB调试,插上电脑,电脑能够自动识别设备
- 输入命令:adb devices,如下图所示:
5.搭建Android应用程序开发环境 (Windows) - 基于Eclipse
- 安装JDK,配置环境变量,个人安装的是JDK1.7
- 下载并安装Eclipse
- 安装ADT,网上教程很多,不再赘述,需要用到翻墙软件(推荐蓝灯)
- 打开Eclipse中的Android SDK Manager,安装如图所示选中的文件:
- 打开Eclipse中的Android Virtual Device Manager,创建一个新的模拟器,参数设置如图所示:
- 单击start即可运行模拟器,运行很慢,所以建议用自己的手机或者平板进行调试
- 运用手机进行安卓调试:参考网上教程,不在赘述。
6.JNI的实现
6.1 新建Android Application Project
- project的相关信息:
Project:JNITest
Package: com.cong.jni
Activity:JNITest
- 编辑res/values/strings.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">JNITest</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="hello">HelloWorld, JNITestActivity</string>
<string name="btn_show">Show</string>
</resources>
- 编辑res/layout/main.xml文件如下,添加了一个EditText控件和一个Button控件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<EditText
android:id="@+id/ed_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"/>
<Button
android:id="@+id/btn_show"
android:layout_width="109dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/btn_show"/>
</LinearLayout>
- 编辑JNITest.java文件:
package com.cong.jni;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class JNITest extends Activity {
// 表示系统第一次加载类的时候,先执行这段代码,这里表示加载动态链接库JNITest.so
static{
System.loadLibrary("JNITest");
}
private native String GetReply(); // native表示这个方法由本地代码定义,需要通过jni接口调用本地c/c++代码。
private EditText edtName;
private Button btnShow;
String reply;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jnitest);
reply= GetReply();
edtName= (EditText)this.findViewById(R.id.ed_name);
btnShow= (Button)this.findViewById(R.id.btn_show);
btnShow.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
edtName.setText(reply); //这段代码表示点击按钮后,把native方法的返回的字符串显示到EditText控件。
}
});
}
}
- 编译工程,生成.class文件,如果这个时候将程序放到手机上调试会出现闪退的现象,查看输出的错误日志,这是正常的。
6.2用javah工具生成符合JNI规范的C语言头文件
- 将生成的project拷贝到Ubuntu中
- 进入工程目录:cd ~/workspace/android_workspace/JNITest
- 新建jni文件夹:mkdir jni
- 执行命令:
javah -jni -classpath /opt/android-sdk-linux/platforms/android-23/android.jar:bin/classes/ -d jni/ com.cong.jni.JNITest
// android.jar的路径:/opt/android-sdk-linux/platforms/android-23/android.jar
// class的路径:bin/classes/
// 生成头文件的目标路径:jni/
- 在jni/目录中将会有com_cong_jni_JNITest.h文件
6.3编写C/C++代码
- 代码放在与生成的头文件同一目录jin/下
- 文件com_cong_jni_JNITest.c如下:
#include<jni.h>
#include<string.h>
#include"com_cong_jni_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_cong_jni_JNITest_GetReply
(JNIEnv *env, jobject obj){
return(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
}
6.4编写Android.mk文件
- 代码放在与生成的头文件com_cong_jni_JNITest.h同一目录jin/下
- 文件Android.mk如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libJNITest
LOCAL_SRC_FILES:= com_cong_jni_JNITest.c
include $(BUILD_SHARED_LIBRARY)
#pay attention to no space after per row
- LOCAL_MODULE表示编译的动态库名、LOCAL_SRC_FILES 表示源代码文件
- 此时jni/文件夹中的文件:
6.5用ndk工具编译并生成.so文件
- 进入工程目录:cd ~/workspace/android_workspace/JNITest
- 执行命令:ndk-build,如图所示:
- 然后libs/armeabi目录下生成了libJNITest.so文件: