环境准备:
1、NDK 下载 Android NDK, Revision 6b(August 2011)
http://developer.android.com/sdk/ndk/index.html
2、android 通过JNI调用lib
package com.pathfindeng.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
static {
System.loadLibrary("testlib");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onResume() {
super.onResume();
testJNISet(123);
Log.v("#######", "from jni "+testJNIGet());
}
public native void testJNISet(int value);
public native int testJNIGet();
}
3、编译生成 MainActivity.class
4、javah 生成 头文件 ,进入 bin 目录
/NDK-test/bin$ javah -classpath . -jni com.pathfindeng.android.test.MainActivity
生成 com_pathfindeng_android_test_MainActivity.h
5、在项目根目录 新建文件夹 jni
|-- jni
| |-- Android.mk
| |-- com_pathfindeng_android_test_MainActivity.h
| `-- testlib.c
6、新建Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testlib
LOCAL_SRC_FILES := testlib.c
include $(BUILD_SHARED_LIBRARY)
7、新建 testlib.c
#include <com_pathfindeng_android_test_MainActivity.h>
int mValue = 0;
/*
* Class: com_pathfindeng_android_test_MainActivity
* Method: testJNISet
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_pathfindeng_android_test_MainActivity_testJNISet (JNIEnv *env, jobject obj, jint fromJava){
mValue = fromJava;
}
/*
* Class: com_pathfindeng_android_test_MainActivity
* Method: testJNIGet
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_pathfindeng_android_test_MainActivity_testJNIGet (JNIEnv *env, jobject ojb){
return mValue;
}
8、NDK 生成 so,ndk/android-ndk-r6b$ ./ndk-build -C ../../workspace/NDK-test/ 生成 so
9 、运行 OK
10、工程目录结构
.
|-- AndroidManifest.xml
|-- assets
|-- bin
| |-- classes.dex
| |-- com
| | `-- pathfindeng
| | `-- android
| | `-- test
| | |-- MainActivity.class
| | |-- R$attr.class
| | |-- R.class
| | |-- R$drawable.class
| | |-- R$layout.class
| | `-- R$string.class
| |-- com_pathfindeng_android_test_MainActivity.h
| |-- NDK-test.apk
| `-- resources.ap_
|-- default.properties
|-- gen
| `-- com
| `-- pathfindeng
| `-- android
| `-- test
| `-- R.java
|-- jni
| |-- Android.mk
| |-- com_pathfindeng_android_test_MainActivity.h
| `-- testlib.c
|-- libs
| `-- armeabi
| `-- libtestlib.so
|-- obj
| `-- local
| `-- armeabi
| |-- libtestlb.so
| |-- libtestlib.so
| `-- objs
| |-- testlb
| | |-- testlb.o
| | `-- testlb.o.d
| `-- testlib
| |-- testlib.o
| `-- testlib.o.d
|-- proguard.cfg
|-- res
| |-- drawable-hdpi
| | `-- icon.png
| |-- drawable-ldpi
| | `-- icon.png
| |-- drawable-mdpi
| | `-- icon.png
| |-- layout
| | `-- main.xml
| `-- values
| `-- strings.xml
`-- src
`-- com
`-- pathfindeng
`-- android
`-- test
`-- MainActivity.java
31 directories, 30 files