android NDK的使用作为android开发人员进阶道路上的必修课,但对于想接触这方面的初学者而言,刚开始可能会让你不知所措,这篇文章针对入门而写,同时也列出了一些可能遇到的问题,并提出了解决办法。当然我们还是从第一个NDK应用JNIHelloWorld开始吧(HelloWorld真伟大,哈)。
在开发之前建议了解下NDK与JNI:
了解NDK与JNI请点这
接下来正式进入我们的入门NDK应用JNIHelloWorld
- 建立一个android应用,这里我们取名JNIHelloWorld,具体如何创建就不多说了。
- 选择我们的工程点击右键->Android Tools->Add Native Support…填写你要生成的动态链接库名字,我这里填JNIHelloWorld。
如果你之前没有添加NDK的开发工具包,那么将会相应的窗口提示NDK location not valid in preferences,要求让你添加NDK,添加方法点击Window->Preferences->Android->NDK,然后找到你NDK所在的路径就行,点击Apple/OK搞定,如果没有下载的请先下载
NDK
NDK下载地址
添加完成后如下目录结构,在工程中将多出一个jni目录
3.打开你的MainActivity.java或者自己任意起一个类如HelloWorld.java(这里用此类做示范),添加如下代码
public class HelloWorld {
static {
System.loadLibrary("JNIHelloWorld");
}
public native String print(String content);
}
此时编译运行工程,之后我们打开工程的目录可以看到bin\classes…下生成了XXX.class文件。
cmd打开doc,使路径到对应工程的classes下例如
G:\android\android4\Test\bin\classes>
此时输入>javah com.example.jnihelloworld.HelloWorld点击enter,ok这是在你的classes下将生成一个com_example_test_HelloWorld.h文件,这个文件即为HelloWorld生成的c++头文件(c/c++内容这里不做简介)。
注意:如果你是在MainActivity下添加这些代码,那么很可能会报错,怎么办呢?那么我们就直接找到对应的java文件,对其进行javah,生成头文件
接着将头文件移到jni目录下,也就是我们上面图片中忽略的那个。最终目录结构就是那样。
4.编辑JNIHelloWorld.cpp文件,添加如下代码
#include <android/log.h>
#include <com_example_jnihelloworld_HelloWorld.h>
#include <jni.h>
#define LOG_TAG "HelloWorld"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args)
JNIEXPORT jstring JNICALL Java_com_example_jnihelloworld_HelloWorld_printJNI(
JNIEnv *e, jobject, jstring s) {
// 从 instring 字符串取得指向字符串 UTF 编码的指针
const char *str = e->GetStringUTFChars(s, JNI_FALSE);//得到方法中传入的内容
int i = sum(2,5);//测试一个函数
LOGD("print:%d",i);
LOGI("dufresne--->%s", (const char *)str);
return e->NewStringUTF("helloJNI&helloWorld");//返回一个内容
}
由于用到android/log.h库,因此我们需要在Android.mk文件声明一下,代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNIHelloWorld
LOCAL_SRC_FILES := JNIHelloWorld.cpp
LOCAL_LDLIBS :=-llog
include $(BUILD_SHARED_LIBRARY)
5.编写MainActivity文件,我们为了简单起见,我们只需要在onCreate方法中添加如下代码:
Log.i("JNIHello", new HelloWorld().print("I am HelloWorld Activity"));
好了,基本上完成了,我们看看运行结果吧!LogCat打印结果如下:
ok,我们的NDK开发的第一个android程序就完成了,恭喜你入门了,哈,如有疑问请留言。
下一篇将介绍jni的一下基本类型。