NDK系统环境变量的配置
去android developer官网选择NDK下载相应的ndk版本,我选择的是ndk-r9d版本,安装完以后要进行系统环境变量的配置,将ndk的安装目录配置到Path系统环境变量中,配置好之后打开cmd执行ndk-build出现如下画面则配置成功。
eclipse开发环境的配置
eclipse安装ADT(这个是安卓的开发环境搭建);
新建一个安卓工程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.MainActivityjavah 命令用于生成头文件,参数是生成.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 := HelloMyJniLOCAL_SRC_FILES := HelloMyJni.cinclude $(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创建的字符串了
新闻热点
疑难解答