在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目录下执行这条命令。反正两个地方总有一个成功….
在执行命令的路径下会生成一个com_znn_ndkdemo2_MainActivity.h的头文件
4.创建jni目录,加入上面生成的头文件,根据头文件实现C代码
头文件的内容:
</span>
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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 <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include "com_znn_ndkdemo2_MainActivity.h"
//#include <android/log.h>
//#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)->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生成动态库
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