Android NDK (学习笔记二) —— 开发第一个Android NDK项目

开发第一个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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值