开发第一个Android NDK项目
javah命令>>>>>>>>>>>>>>>>>>>
用法:javah [options] <classes>
其中, [options] 包括:
-o <file> 输出文件 (只能使用 -d 或 -o 之一)
-d <dir> 输出目录
-v -verbose 启用详细输出
-h --help -? 输出此消息
-version 输出版本信息
-jni 生成 JNI 样式的标头文件 (默认值)
-force 始终写入输出文件
-classpath <path> 从中加载类的路径
-cp <path> 从中加载类的路径
-bootclasspath <path> 从中加载引导类的路径
<classes> 是使用其全限定名称指定的
开发Android NDK项目的步骤:
1.创建Android项目
2.创建JNI目录
3.编写java层native方法
4.生成jni头文件
详细步骤:
1.创建HelloNDK项目,在Andorid项目中添加jni目录
2.为Android HelloNDK项目中MainActivity添加java层的native的方法如下:
public static native String getStringFromC();
3.通过javah命令进行编译(在对应的工程目录下执行)
H:\Java-Workspace\HelloNDK>javah -classpath bin/classes -d jni com.child.hellondk.MainActivity
错误: 无法访问android.app.Activity
找不到android.app.Activity的类文件
截图如下:
修改为:
javah -classpath bin/classes;H:\Android\Android-SDK\sdk\platforms\android-21\android.jar -d jni com.child.hellondk.MainActivity
[从中加载类的路径][;][指定android.jar文件,其中包括android.app.Activity的类文件] [输出目录为jni目录] [包名.类名]
javah命令运行成功之后,并生成了Android的jni头文件(com_child_hellondk_MainActivity.h)
4.在jni文件中添加hello.c文件,实现头文件,即在hello.c文件中添加入下代码:
#include <stdio.h>
#include <stdlib.h>
#include "com_child_hellondk_MainActivity"
JNIEXPORT jstring JNICALL Java_com_child_hellondk_MainActivity_getStringFromC
(JNIEnv *env, jclass jclass){
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
5.在jni目录下添加Android.mk文件,做修改如下:
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
6.通过cmd打开DOS,在H:\Java-Workspace\HelloNDK目录下,执行ndk-build命令,进行编译:
H:\Java-Workspace\HelloNDK>ndk-build
[armeabi] Compile thumb : hello <= hello.c
[armeabi] SharedLibrary : libhello.so
[armeabi] Install : libhello.so => libs/armeabi/libhello.so
7.之后就会在项目obj目录下生成hello.so文件
8.在MainActivity中导入so文件,之后调用native方法即可:
public class MainActivity extends Activity {
static{
System.loadLibrary("hello");
}
public static native String getStringFromC();
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView.setText(getStringFromC());
}
}
9.运行即可
(注意arm架构.so文件,必须运行在arm架构虚拟机中,genymotion默认为x86架构,运行就会马上崩溃,修改genymotion架构为arm架构方法见博文:http://blog.csdn.net/myronchi/article/details/46416401)