您的位置:首页 > 移动开发 > Android开发

Android studio NDK-JNI HelloJNI

2016-08-24 00:00 363 查看
摘要: 进入NDK的世界

上一篇文章教了一些大家配置生成so .h 等方法。这边就来讲下如何写一个HelloJNI的项目工程,

开始了。
在AS中新建一个Project,然后再新建一个class文件HelloJNI,在内部声明native方法(jni使用的定义)。

public class HelloJNI {
public native String getClanguageString();

static {
System.loadLibrary("hellojni");
}
}

在工程的文件入口Activity写下如下代码

public class MainActivity extends AppCompatActivity {
private TextView mTextview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextview = (TextView)findViewById(R.id.textView);
HelloJNI helloJni = new HelloJNI(); //创建helloJni对象
mTextview.setText(helloJni.getClanguageString());//调用getClanguageString()方法
}
}

这里需要一个比较重要的步骤(这里需要先将project build一下)
接下来使用我们上篇的教程选中工程里面HelloJNI文件右键,


找到如下菜单,选择NDK-->javah方法。
然后我们就会看先在main目录下面生了一个新的目录。--> jni <--对这个就我们需要的目录里面自然也生成了响应的.h文件,掌声在哪里。
打开文件.h 查看内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_org_text_HelloJNI */

#ifndef _Included_com_org_text_HelloJNI
#define _Included_com_org_text_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_org_text_HelloJNI
* Method:    getClanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_org_text_HelloJNI_getClanguageString
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

.h文件生成完毕之后,我们需要写对应的c或者cpp文件,也就是是C/C++文件,在jni目录下面我们在创建一个文件helloJni.c的文件 内容如下

//
// Created by 许健 on 16/8/24.
//

#include "com_org_text_HelloJNI.h"

JNIEXPORT jstring JNICALL Java_com_org_text_HelloJNI_getClanguageString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"HelloWorld!");
}

文件写好之后 需要在工程的找到local.properties文件中添加NDK路径(之前下载好的)
添加在sdk后面就好

sdk.dir=/Users/xujian/Documents/Android_eclipse/android_DEV/sdk
ndk.dir=/Users/xujian/Documents/Android_eclipse/android_DEV/android-ndk-r10

在找到gradle.properties文件添加

android.useDeprecatedNdk=true

接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

defaultConfig {
......
//定义使用ndk
ndk{
moduleName "hellojni"         //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。
}
}

接下来就是编译工程运行就可以了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息