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

Android关于JNI开发(2)-----Android Studio工具开发

2016-07-13 17:11 525 查看
           关于jni的简介,在我的上篇博客Android关于JNI开发(1)-----eclipse工具开发里面已经介绍过了,这里就不在多讲,因为上篇博客里面开发工具用的是eclipse,而现在基本都已经开始用Android
Studio了,所以这里在介绍一下用Android Studio开发jni.网上有很多将步骤的,然而靠谱的不是很多。这里给大家提供一个流程。然后在将一些常见的问题的处理方法。

       我这里用的AS版本是2.0,ndk的版本是10r。最开始ndk版本是8r,各种问题,后来改成10r,就好了。

 1,创建一个android工程,JniDemo,并在MainActivity中添加一个本地方法:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv=(TextView)findViewById(R.id.tv);
}
public native String getString();
}
    如果你的本地方法报错(是红色的),可以不用管它,也可以settings->plugins->Android NDK Support后面的勾去掉就可以了。

2,   进入文件夹D:\Android\JniDemo\app\src\main\java然后按住shift键,点鼠标右键,然后选择“在此处打开命令窗口”,然后进入doc命令的界面,
     然后输入命令javah com.example.gaolong.jnidemo.MainActivity如果没有错误,则会在D:\Android\JniDemo\app\src\main\java下生成一个文件  com_example_gaolong_jnidemo_MainActivity.h,程序中在D:\Android\JniDemo\app\src\main\java\com\example\gaolong\jnidemo下出现
         com_example_jnidemo_MainActivity.h文件。

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

#ifndef _Included_com_example_gaolong_jnidemo_MainActivity
#define _Included_com_example_gaolong_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_example_gaolong_jnidemo_MainActivity
* Method:    getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_gaolong_jnidemo_MainActivity_getString
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


 3,
然后在D:\Android\JniDemo\app\src\main下创建一个文件夹,命名为“jni”,将com_example_jnidemo_MainActivity.h复制到jni中,然后创建两个c文件(一个写自己的代码,一个什么都不写,AS开发jni的时候有一个bug,就是如果jni中只有一个c文件,编译的时候会出错。)jni.c和empty.c然后打开.h文件夹,将里面的方法复制到jni.c文件夹中,然后补全参数和要实现的逻辑代码。在.c中加入导入文件的代码。

jni.c代码内容如下:

#include<stdlib.h>
#include<stdio.h>
#include"com_example_gaolong_jnidemo_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_gaolong_jnidemo_MainActivity_getString
(JNIEnv * env, jobject job){

return (*env)->NewStringUTF(env,"I'm comes from to Native Function!");
}


4,配置ndk.选中ndk的路径,然后ok,接着,检查local.properties文件,末尾是否增加了ndk路径



ndk.dir=D\:\\BaiduYunDownload\\android-ndk32-r10-windows-x86\\android-ndk-r10
sdk.dir=D\:\\ruanjiananzhuangbao\\sdk


5.修改app下的build.gradle,在defaultConfig 中增加

defaultConfig {
applicationId "com.example.gaolong.jnidemo"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"

ndk {
moduleName "jni"  //你的so库文件名
}
}


6在gradle.properties文件中,末尾增加代码:

android.useDeprecatedNdk=true

7最后MainActivity.java中增加相应调用代码,即调用c代码中的方法。

public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv=(TextView)findViewById(R.id.tv);
tv.setText(getString());
}
public native String getString();
}


8然后直接run就可以了,运行成功。

我的源码在这里,有需要的朋友可以下载一下。源码:源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: