首页 > 学院 > 开发设计 > 正文

NDK开发

2019-11-09 16:25:11
字体:
来源:转载
供稿:网友

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 := 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创建的字符串了 这里写图片描述


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表