首页 > 系统 > Android > 正文

Android Studio NDK 开发

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

在网上看到一个Android Studio NDK开发教程,觉得不错,转过来跟大家分享,原地址

http://www.2cto.com/kf/201607/526887.html

1.环境的配置就略过了,网上有很多教程

2、java代码和C代码的编写步骤及过程

首先新建一个java类JNIUtils.java

publicclassJNIUtils {    static{        System.loadLibrary("huazict");    }     //java调C中的方法都需要用native声明且方法名必须和c的方法名一样    publicnativeString getString();}然后如下图所示重新Make PRoject一下工程:
会在工程目录E:/work/Myapplication/stujni/build/intermediates/classes/debug/com/huazi/stujni/jni中看到自己编译后的class文件JNIUtils.class如下图所示:

其次就是生成.h文件了

在studio打开Terminal命令行工具,打开步骤是View->Tool Windows->Terminal (或直接按Alt+F12),如下图所示:

然后在命令行中先进入到工程的main目录下

输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径

例如:javah -d jni -classpath E:/work/MyApplication/stujni/build/intermediates/classes/debug com.huazi.stujni.jni.JNIUtils(注意debug后的空格)

看到上图,图中命令行中是直接进入到了工程的main目录下(在哪个目录下运行就会在哪个目录下自动生成jni文件夹),按回车之后就会在main目录下生成jni文件夹,同时生成.h文件,如下图:

这个文件.h文件不需要做任何修改,默认即可。

现在我们来写一个test的C文件huazict.c同.h文件一样放到jni文件夹下,代码如下:

 ?

#include"com_huazi_stujni_jni_JNIUtils.h"/** * 上边的引用标签一定是.h的文件名家后缀,方法名一定要和.h文件中的方法名称一样 */JNIEXPORT jstring JNICALL Java_com_huazi_stujni_jni_JNIUtils_getString        (JNIEnv *env, jobject obj) {    return(*env)->NewStringUTF(env,"这是我测试的jni");}

最后在构建文件中的默认配置中加上:

 

//ndk编译生成.so文件  ndk {          moduleName"huazict"        //生成的so名字//输出指定三种abi体系结构下的so库。          abiFilters"armeabi","armeabi-v7a","x86"   }
配置好之后就执行 Buide-->MakeProject然后就可以运行app了。(这一步一定不能忘记,否则会报错找不到ndk输出路径)

到这里,通过jni调C就完成了,现在我们来测试一下,写个TextView显示一下调用的C:

 

?
1234567891011publicclassMainActivityextendsAppCompatActivity {     @Override    protectedvoidonCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView tv = (TextView)findViewById(R.id.tv);         tv.setText(newJNIUtils().getString());    }}
看效果,直接上图:

三、调用编译过的.so库

上边编译完成了,有人会问:我要的是编译后的.so库,别人用的时候直接拿来用就可以了,那编译后的.so库在哪呢?不要着急请看下图:


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