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

android studio NDK-JNI调用

2016-03-18 22:48 405 查看
原文发表在http://mybeibei.net/?p=1039

为了学习cydia_substrate框架,要在Android Studio上搭建NDK环境,网上查了好多教程,也询问了一些android的群,各种不行,折腾了一下午,最终发现是NDK版本问题(之前用ndk r8版本

),最终解决,特将配置流程记下,以免其它像我这样的菜鸟再次入坑:

一、环境准备:

Android Studio(用的是1.3.2版本)

NDK(android-ndk-r11版本)

二、配置开始:

1.创建新的一个project,并建立一个blank Activity

2.在MainActivity.java中增加一个方法

代码:
public native String getStringFromNative();


此时“getStringFromNative()”会有红色报错,不用管它,继续下一步

3.打开as的Teminal,进入到app/src/main/java目录下,输入:javah -d ../jni com.kuhn.myjni.MainActivity,如果没有任何报错,这时as刷新后,会多出一个jni的文件夹,该文件夹下会出现com.kuhn.myjni.MainActivity.h文件,文件内容类似下面这样:

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

#ifndef _Included_com_kuhn_mykuhn_MainActivity
#define _Included_com_kuhn_mykuhn_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_kuhn_mykuhn_MainActivity
* Method:    getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_kuhn_mykuhn_MainActivity_getStringFromNative
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


4.接着,修改local.properties文件,末尾增加ndk路径:

代码:
ndk.dir=D\:\\android-ndk-r11


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

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


6.在jni目录下新建一个.c文件,我的叫“jni.c”,然后将.h头文件包含进去,并写入相应代码:

代码:
//
// Created by Kuhn on 2016/3/17.
//
#include "com_kuhn_mykuhn_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_kuhn_mykuhn_MainActivity_getStringFromNative
(JNIEnv * env, jobject obj){
return (*env)->NewStringUTF(env,"I'm comes from to Native Function!");
}


如果正确无报错的话,左侧会出现红绿色的相交箭头,表示方法调用了:



7.MainActivity.java中增加相应调用代码:

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


8.最后在gradle.properties文件中,末尾增加

代码:
android.useDeprecatedNdk=true


,否则会运行报错

9.OK,大功告成,上图:

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