Ubuntu开发环境搭建(5)【Android-JNI开发环境 (windows10+ubuntu16.04)】

来源:互联网 发布:2017淘宝流量突然下降 编辑:程序博客网 时间:2024/06/06 05:11

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_131JRE_HOME=$JAVA_HOME/jreJAVA_BIN=$JAVA_HOME/binCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/libPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/binexport JAVA_HOME JRE_HOME PATH CLASSPATH
  • 使得环境变量生效:source ~/.bashrc
  • 验证:java -version,打印java信息,如果没有反应,尝试关闭当前终端,或者重启
    image

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-r8bexport NDK_HOMEexport PATH=$PATH:$NDK_HOME
  • 使得环境变量生效:source ~/.bashrc
  • 验证:ndk-build,打印ndk信息,如果没有反应,尝试关闭当前终端,或者重启
    image

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-linuxexport PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform:$ANDROID_HOME/platform_tools
  • 使得环境变量生效:source ~/.bashrc
  • 验证:android,弹出Android SDK Manager的对话框,如果不行,尝试重启
    image
  • 选择下载相关文件
Android SDK Tools 24.4.1Android SDK Platform-tools 25.0.6Android SDK Build-tools 24.0.3Android6.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,如下图所示:

image

5.搭建Android应用程序开发环境 (Windows) - 基于Eclipse

  • 安装JDK,配置环境变量,个人安装的是JDK1.7
  • 下载并安装Eclipse
  • 安装ADT,网上教程很多,不再赘述,需要用到翻墙软件(推荐蓝灯)
  • 打开Eclipse中的Android SDK Manager,安装如图所示选中的文件:
    image
  • 打开Eclipse中的Android Virtual Device Manager,创建一个新的模拟器,参数设置如图所示:
    image
  • 单击start即可运行模拟器,运行很慢,所以建议用自己的手机或者平板进行调试
  • 运用手机进行安卓调试:参考网上教程,不在赘述。

6.JNI的实现

6.1 新建Android Application Project

  • project的相关信息:
Project:JNITestPackage: com.cong.jniActivity: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 := libJNITestLOCAL_SRC_FILES:= com_cong_jni_JNITest.cinclude $(BUILD_SHARED_LIBRARY)#pay attention to no space after per row
  • LOCAL_MODULE表示编译的动态库名、LOCAL_SRC_FILES 表示源代码文件
  • 此时jni/文件夹中的文件:
    image

6.5用ndk工具编译并生成.so文件

  • 进入工程目录:cd ~/workspace/android_workspace/JNITest
  • 执行命令:ndk-build,如图所示:
    image
  • 然后libs/armeabi目录下生成了libJNITest.so文件:
    image
原创粉丝点击