HelloJni工程的搭建
在建立NDK工程之前要进行环境的搭建,有以下两个方面需要搭建的:
NDK系统环境变量的配置
去android developer官网选择NDK下载相应的ndk版本,我选择的是ndk-r9d版本,安装完以后要进行系统环境变量的配置,将ndk的安装目录配置到Path系统环境变量中,配置好之后打开cmd执行ndk-build出现如下画面则配置成功。
eclipse开发环境的配置
eclipse安装ADT(这个是安卓的开发环境搭建);
开始编写NDK工程:
新建一个安卓工程HelloJni,在MainActivity里声明native方法
public static native String getStringFromC();
打开cmd进入到HelloJni的根目录下
cd E:\MyProject\eclipsem\HelloMyJni
使用javah命令生成相应的.h头文件
javah -classpath bin/classes;D:\adt-bundle-windows-x86_64-20130522\sdk\platforms\android-17\android.jar -d jni com.example.hellomyjni.MainActivity
javah 命令用于生成头文件,参数是生成.h文件的相应的类(全类名);
-classpath 指定类的加载目录(有两个类一个是位于bin下的MainActivity和sdk下的android.jar包的Activity类,用分号隔开);
-d 表示输出路径在jni文件夹下;
生成之后会在项目工程的jni目录下发现com_example_hellomyjni_MainActivity.h文件
然后为项目添加native支持:项目右键->Android Tools-> add native support
此时打开.h文件出现错误如下图
这个是因为没有导入jni头文件的原因。
Project Properties -> C/C++ General -> Path and Symbols
选择include标签,Add -> File system -> 选择ndk安装目录下的\platforms\android-17\arch-arm\usr\include
且选中All languages.
最后Apply -> OK
这样错误就解决了。
接下来就是实现刚才定义的getStringFromC();方法了
修改jni目录下的HelloJni.cpp文件(没有则创建),实现以下代码:
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include "com_example_hellomyjni_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_hellomyjni_MainActivity_getStringFromC
(JNIEnv * env, jclass jclass){
return (*env)->NewStringUTF(env,"Hello from JNI");
}
这样我们就实现了Java_com_example_hellomyjni_MainActivity_getStringFromC函数了。
接下来在jni目录下还要有一个Android.mk文件声明要编译的内容,修改(没有则新建,添加一下代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloMyJni
LOCAL_SRC_FILES := HelloMyJni.c
include $(BUILD_SHARED_LIBRARY)
其中LOCAL_MODULE表示生成的.so库的名称,LOCAL_SRC_FILES表示要编译的c文件名称,自行修改
修改完之后就要进行ndk-build命令了,cmd进入项目根目录下,执行ndk-build之后再项目的obj文件夹下就生成了.so文件
在MainActivity中加载so库:
public class MainActivity extends Activity {
static{
System.loadLibrary("HelloMyJni");
}
public static native String getStringFromC();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(getStringFromC());
}
}
运行可见textview已经获得了从jni创建的字符串了