环境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里显示的内容正常。