一.安装NDK

1.下载,解压NDK。

2.在Eclipse->窗口->首选项->Android->NDK->NDK Location 填写NDK所在目录,如下图:


二:.在Eclipse新建工程:JNIbuton。

在src下新建一个class:JNIbuttonnative.java,声明为 native 的 Java 函数如下:

package com.example.jnibutton;public class JNIbuttonnative {public static native int print(); }
三:.编译JNI。

找到Android项目中bin目录下,会有classes文件夹,Eclipse自动为我们生成的字节码文件就在这个目录下。

在cmd下,进入工程所在目录下的bin\classes\目录,运行javahcom.example.jnibutton.JNIbuttonnative,即可生成相应.h头文件,如下图:


运行 javah命令是可能会出现 java不是内部命令这一错误,这是环境变量没有配置好。

PATH环境变量,有以下两种方法都尝试一下:

%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

D:\android\android-ndk-r9d;C:\Program Files\Java\jdk1.8.0_91\bin;

四:.在工程下新建jni文件夹。

1.将上一步生成的.h头文件移到jni目录下。

2.在jni目录下新建Android.mk文件,如下:

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := JNIbuttonNative LOCAL_SRC_FILES := JNI_print.cLOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)
在上面的内容里第一行与第二行是固定的。第三行定义了编译的目标名字。第四行定义了要编译的.c 文件。第五行定义了编译时的链接库。第六行定义了编译的目标类型。 BUILD_SHARED_LIBRARY 指的是编译成动态链接库,即.so 文件。

3.到了这一步我们终于可以作用 NDK 了,在jni目录下创建与.h头文件相对应的c程序文件,JNI_print.c,如下:
#include<stdio.h>#include "com_example_jnibutton_JNIbuttonnative.h" JNIEXPORT int JNICALL Java_com_example_jnibutton_JNIbuttonnative_print  (JNIEnv *env, jclass class){return 1;}
4.在cmd进入jni目录,运行ndk-build,即可编译相应库文件,如下:

编译成功后会在工程目录的libs/armeabi目录下生成一个libTestJNI.so文件。


五:编写Android测试程序。

1.编写activity_jnibutton.xml布局文件,添加button,如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.jnibutton.JnibuttonActivity" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text=""         android:id="@+id/ts"        />    <Button         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/ok"        android:text="点我"        /></RelativeLayout>


2.编写主程序JnibuttonActivity.java,加载动态库,添加一个button,点击button后,调用动态库定义的函数,如下;

package com.example.jnibutton;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.widget.TextView;public class JnibuttonActivity extends Activity {static {          // 加载动态库          System.loadLibrary("JNIbuttonNative");      }      @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_jnibutton);                final Button bn = (Button)findViewById(R.id.ok);        bn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO 自动生成的方法存根final TextView text =(TextView)findViewById(R.id.ts);text.setText("hello" + JNIbuttonnative.print());}});            }}






更多相关文章

  1. android 模拟器 使用SD卡
  2. android源代码编译
  3. Android学习笔记(2):Hello world
  4. Android(安卓)zip文件压缩解压
  5. 转:Android中几种图像特效处理方法小结
  6. Android根据文件路径加载指定文件
  7. android复制数据库到SD卡
  8. Android(安卓)Studio修改默认Activity继承AppCompatActivity
  9. NPM 和webpack 的基础使用

随机推荐

  1. Ubuntu下编译android所需ffmpeg的so库
  2. Android StateMachine记录
  3. android使用web加载网页的js问题
  4. Android常用网址
  5. Android WebView untold stories
  6. Android(安卓)Studio如何设置自动import
  7. android memory 优化
  8. 为什么我要改用Kotlin
  9. [RK3399] [Android 9.0] 调试2560x1440分
  10. Android 常用代码大集合