主要介绍ndk的使用入门,也就是最简单的helloworld!程序员最爱HelloWorld了!
在练手之前,确保你已经下载并配置好了android ndk开发的环境了,这里就不描述了。
一、简单练习项目结构
(1).如要求在项目根目录下创建jni文件夹,在创建我们的c文件:hellNDK.c
#include <jni.h>
/*
* 方法名称规定 : Java_完整包名类名_方法名()
* JNIEnv 指针
*
* 参数介绍 :
* env : 代表Java环境, 通过这个环境可以调用Java中的方法
* thiz : 代表调用JNI方法的对象, 即MainActivity对象
*/
jstring Java_org_jan_android_ndk_MainActivity_helloFromJNI(JNIEnv *env, jobject thiz)
{
/*
* 调用 android-ndk-r9c\platforms\android-8\arch-arm\usr\include 中jni.h中的方法
* jni.h 中定义的方法 jstring (*NewStringUTF)(JNIEnv*, const char*);
*/
return (*env)->NewStringUTF(env, "hello world ndk!你好!");
}
(2).编写Android.mk文件,这是个Makefile,我们需要了解一些常用的环境变量如下
LOCAL_PATH指定源码的目录,$(call my-dir),学过Linux Shell再熟悉不过了
LOCAL_MODULE编译生成的.so库
LOCAL_SRC_FILES指定加入编译的源文件
LOCAL_LALIBS指定其他库,-l + 库名
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloNDK
LOCAL_SRC_FILES := helloNDK.c
include $(BUILD_SHARED_LIBRARY)
(3).在项目路径下,执行命令:ndk-build
编译出已经命名的helloNDK.so
public class MainActivity extends Activity {
static{
//加载静态库文件
System.loadLibrary("helloNDK");
}
/*
* 声明一个native方法
* 这个方法在Java中是没有实现的, 没有方法体
* 该方法需要使用C语言编写
*/
public native String helloFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(helloFromJNI());
}
public void onClick(View view) {
//点击按钮显示从jni调用得到的字符串信息
Toast.makeText(getApplicationContext(), helloFromJNI(), Toast.LENGTH_SHORT).show();
}
效果如下