介是啥米东东

Hello NDK 2

Android admin 2396℃ 0评论

http://115.28.189.59/?p=75 使用的是手动写头文件和方法的声明,但是同样可以通过javah脚本来实现方法的声明。使用javah来完成NDK开发需要以下几个步骤:

1.创建一个Android工程

2.在Java代码中声明native方法

3.用javah来生成头文件

4.创建jni目录,加入上面生成的头文件,根据头文件实现C代码

5.编写Android.mk文件

6.使用ndk-build生成动态库

7.在Java中静态加载动态库,在需要的地方调用native方法。

 

1.创建一个Android工程

新建一个Android工程NDKDemo2

2.在Java代码中声明native方法

public native String Hello();

3.用javah来生成头文件

在生成头文件前,应保证java文件被编译过。最简单的方式就是直接run一下。

cmd打开命令行,定位到Android工程目录,进入bin/classes目录下

执行javah com.znn.ndkdemo2.MainActivity (也就是含有native方法的类的包名.类名)。

如果没有任何输出就是执行成功,如果出现错误提示找不到Android.app.Activity类那么就切换到src目录下执行这条命令。反正两个地方总有一个成功….

360软件小助手截图20140430000112

在执行命令的路径下会生成一个com_znn_ndkdemo2_MainActivity.h的头文件

4.创建jni目录,加入上面生成的头文件,根据头文件实现C代码

头文件的内容:

</span>

/* DO NOT EDIT THIS FILE - it is machine generated */
#include &lt;jni.h&gt;
/* Header for class com_znn_ndkdemo2_MainActivity */

#ifndef _Included_com_znn_ndkdemo2_MainActivity
#define _Included_com_znn_ndkdemo2_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_znn_ndkdemo2_MainActivity
* Method: Hello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_znn_ndkdemo2_MainActivity_Hello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

在jni目录下新建一个Hello.c

</span>

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;jni.h&gt;
#include "com_znn_ndkdemo2_MainActivity.h"

//#include &lt;android/log.h&gt;
//#define LOG_TAG "System.out"
//#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
//#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

JNIEXPORT jstring JNICALL Java_com_znn_ndkdemo2_MainActivity_Hello
(JNIEnv *env, jobject clazz){
//LOGD("%s","LOG............................................");
(*env)-&gt;NewStringUTF(env, "hello this is From JNI!!!!");
}

注意:从头文件复制方法声明的时候不要忘了加上形参env,clazz,方法声明中默认省略掉了。

5.编写Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
#LOCAL_LDLIBS += -llog #引入log对应的库文件
include $(BUILD_SHARED_LIBRARY)

内容跟上个博客内容一样

6.使用ndk-build生成动态库

360软件小助手截图20140430001425

7.在Java中静态加载动态库,在需要的地方调用native方法。

刷新工程

</span>

package com.znn.ndkdemo2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

private TextView txtTextView;
private Button button;

static{
System.loadLibrary("Hello");
}

public native String Hello();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

txtTextView = (TextView) findViewById(R.id.txt);
button = (Button) findViewById(R.id.btn);
txtTextView.setText(Hello());
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
Toast.makeText(getApplicationContext(), Hello(), Toast.LENGTH_SHORT).show();
}
});
}

}

<span style="color: #444444;">

运行…..

源代码:https://github.com/qduningning/NDKDemo2
[onebox url="https://github.com/qduningning/NDKDemo2"]

转载请注明:Z/RANDY » Hello NDK 2

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址