环境eclipse 4.4 安装ADT插件。
NDK android-ndk-r10d 32位的。本人的android环境目前都是32位。
android-ndk-r10d 是个exe的压缩包。双击即可解压。
打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径,例如我的是D:\android\PlatformSDKs\android-ndk-r10d
新建一个Android工程myandroidjni,在工程上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字,例如:myandroidjnindk
创建完毕后。会多出一个JNI的文件夹。和其他一些相关的文件。在JNI下有Android.mk和myandroidjnindk.cpp文件。Android.mk是NDK工程的Makefile,myandroidjnindk.cpp就是NDK的源文件。
在创建的MainActivity 增加以下native方法:
public native String stringformJNI();
public native String getImie();
保存。到classes目录下用javah生成对应C/C++的头文件。
javah -classpath D:\androidsdk\platforms\android-18\android.jar;. -jni com.example.myandroidjni.MainActivity
执行完毕后,会在classes下生成一个C/C++的头文件。我们将它include到cpp文件中。
#include "../bin/classes/com_example_myandroidjni_MainActivity.h"
生成的头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_myandroidjni_MainActivity */ #ifndef _Included_com_example_myandroidjni_MainActivity #define _Included_com_example_myandroidjni_MainActivity #ifdef __cplusplus extern "C" { #endif #undef com_example_myandroidjni_MainActivity_MODE_PRIVATE #define com_example_myandroidjni_MainActivity_MODE_PRIVATE 0L #undef com_example_myandroidjni_MainActivity_MODE_WORLD_READABLE #define com_example_myandroidjni_MainActivity_MODE_WORLD_READABLE 1L #undef com_example_myandroidjni_MainActivity_MODE_WORLD_WRITEABLE #define com_example_myandroidjni_MainActivity_MODE_WORLD_WRITEABLE 2L #undef com_example_myandroidjni_MainActivity_MODE_APPEND #define com_example_myandroidjni_MainActivity_MODE_APPEND 32768L #undef com_example_myandroidjni_MainActivity_MODE_MULTI_PROCESS #define com_example_myandroidjni_MainActivity_MODE_MULTI_PROCESS 4L #undef com_example_myandroidjni_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING #define com_example_myandroidjni_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L #undef com_example_myandroidjni_MainActivity_BIND_AUTO_CREATE #define com_example_myandroidjni_MainActivity_BIND_AUTO_CREATE 1L #undef com_example_myandroidjni_MainActivity_BIND_DEBUG_UNBIND #define com_example_myandroidjni_MainActivity_BIND_DEBUG_UNBIND 2L #undef com_example_myandroidjni_MainActivity_BIND_NOT_FOREGROUND #define com_example_myandroidjni_MainActivity_BIND_NOT_FOREGROUND 4L #undef com_example_myandroidjni_MainActivity_BIND_ABOVE_CLIENT #define com_example_myandroidjni_MainActivity_BIND_ABOVE_CLIENT 8L #undef com_example_myandroidjni_MainActivity_BIND_ALLOW_OOM_MANAGEMENT #define com_example_myandroidjni_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L #undef com_example_myandroidjni_MainActivity_BIND_WAIVE_PRIORITY #define com_example_myandroidjni_MainActivity_BIND_WAIVE_PRIORITY 32L #undef com_example_myandroidjni_MainActivity_BIND_IMPORTANT #define com_example_myandroidjni_MainActivity_BIND_IMPORTANT 64L #undef com_example_myandroidjni_MainActivity_BIND_ADJUST_WITH_ACTIVITY #define com_example_myandroidjni_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L #undef com_example_myandroidjni_MainActivity_CONTEXT_INCLUDE_CODE #define com_example_myandroidjni_MainActivity_CONTEXT_INCLUDE_CODE 1L #undef com_example_myandroidjni_MainActivity_CONTEXT_IGNORE_SECURITY #define com_example_myandroidjni_MainActivity_CONTEXT_IGNORE_SECURITY 2L #undef com_example_myandroidjni_MainActivity_CONTEXT_RESTRICTED #define com_example_myandroidjni_MainActivity_CONTEXT_RESTRICTED 4L #undef com_example_myandroidjni_MainActivity_RESULT_CANCELED #define com_example_myandroidjni_MainActivity_RESULT_CANCELED 0L #undef com_example_myandroidjni_MainActivity_RESULT_OK #define com_example_myandroidjni_MainActivity_RESULT_OK -1L #undef com_example_myandroidjni_MainActivity_RESULT_FIRST_USER #define com_example_myandroidjni_MainActivity_RESULT_FIRST_USER 1L #undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DISABLE #define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DISABLE 0L #undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DIALER #define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DIALER 1L #undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SHORTCUT #define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SHORTCUT 2L #undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL #define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L #undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL #define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L /* * Class: com_example_myandroidjni_MainActivity * Method: stringformJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_myandroidjni_MainActivity_stringformJNI (JNIEnv *, jobject); /* * Class: com_example_myandroidjni_MainActivity * Method: getImie * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_myandroidjni_MainActivity_getImie (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
装载so文件:
static{
System.loadLibrary("myandroidjnindk");
}
在active的布局文件加上以下几个控件:
<TextView android:id="@+id/tv1" android:layout_width="match_parent" android:layout_height="50dip" android:text="@string/hello_world" /> <Button android:id="@+id/btn1" android:layout_below="@id/tv1" android:layout_width="match_parent" android:layout_height="50dip" android:text="btn1" /> <Button android:id="@+id/btn2" android:layout_below="@id/btn1" android:layout_width="match_parent" android:layout_height="50dip" android:text="btn2" /> <Button android:id="@+id/btn3" android:layout_below="@id/btn2" android:layout_width="match_parent" android:layout_height="50dip" android:text="btn3" /> <Button android:id="@+id/btn4" android:layout_below="@id/btn3" android:layout_width="match_parent" android:layout_height="50dip" android:text="btn4" />
在MainActivity定义以下几个变量:
private Button btn1=null;
private Button btn2=null;
private Button btn3=null;
private Button btn4=null;
private TextView tv1=null;
在 onCreate的后面填写以下代码:
btn1=(Button)findViewById(R.id.btn1); btn2=(Button)findViewById(R.id.btn2); btn3=(Button)findViewById(R.id.btn3); btn4=(Button)findViewById(R.id.btn4); tv1=(TextView)findViewById(R.id.tv1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub tv1.setText(stringformJNI()); } }); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub tv1.setText(getImie()); } }); btn4.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub finish(); } });
保存编译运行。发现app无法启动。报加载so文件失败。在JNI文件夹下加入Application.mk这个文件。内容为 APP_ABI := all
在编译运行。此时app能够正常运行。TextView里显示的内容正常。