一.安装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\目录,运行javah com.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.c LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)在上面的内容里第一行与第二行是固定的。第三行定义了编译的目标名字。第四行定义了要编译的.c 文件。第五行定义了编译时的链接库。第六行定义了编译的目标类型。 BUILD_SHARED_LIBRARY 指的是编译成动态链接库,即.so 文件。
#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文件。
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>
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() { @Override public void onClick(View v) { // TODO 自动生成的方法存根 final TextView text =(TextView)findViewById(R.id.ts); text.setText("hello" + JNIbuttonnative.print()); } }); } }