前提
编程环境介绍:
Android Studio版本1.5
此处 不介绍各种的环境变量设置(比如JAVA_HOME;CLASSPATH;NDK_ROOT;Path)
首先,需要下载NDK,配置环境。
下载并安装需要一段时间,然后进行下一步,项目右键打开Open Module Settings(快捷键 F4 )
路径是在SDK目录下的ndk-bundle文件夹,这个是下载自动安装到的目录。
在开始JNI开发之前,需要确认你的javah命令是否可以使用。
javah命令不好使,或许是因为没有设环境变量。
通过命令行输入javah回车后,可以打印出相应信息,算是成功了。
接下来可以进入JNI开发了。
正题
首先,新建 一个项目,并按照如下方式写上代码
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("JniTest");
}
public native String getStringFromNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(getStringFromNative());
}
}
然后,构建项目生成MainActivity.class文件,查看在如下目录:
\项目文件夹\app\build\intermediates\classes\debug\包名\MainActivity.class
接下来,用命令javah生成.h文件。这里需要注意的是要进入 \app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在\app\src\main路径下,可以在Studio的工程结构中直接看到。
javah -d jni -classpath D:\Android\sdk\extras\android\m2repository\com\android\support\appcompat-v7\23.2.1\appcompat-v7-23.2.1-sources.jar;..\..\build\int
ermediates\classes\debug com.glodon.ndk.MainActivity
回车之后,便可生成jni文件夹
编辑main.c文件
复制如下代码到main.c文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
/* Header for class lab_sodino_jnitest_MainActivity */
#ifndef _Included_com_glodon_ndk_MainActivity
#define _Included_com_glodon_ndk_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_glodon_ndk_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_glodon_ndk_MainActivity_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGE("log string from ndk.");
return (*env)->NewStringUTF(env,"Hello From JNI!");
}
#ifdef __cplusplus
}
#endif
#endif
到这里后,我们再执行一个”Build->Make Project”,发现Messages里报错
需要去项目根目录下的 gradle.properties 文件里添加如下代码:
android.useDeprecatedNdk=true
再次去执行”Build->Make Project”,还是会报错
修改build.gradle配置
工程中共有两个build.gradle配置文件,我们要修改的是在\app\build.gradle这个文件。为其在defaultConfig分支中增加上
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
最后,去执行”Build->Make Project”。应该是成功啦。会生成一些.so文件
此时运行项目应该会得到如下结果
手机设备或者是模拟器界面上也会显示出 “Hello From JNI!”
这就表示成功啦!
在开发过程中,遇到了这样的一个问题,此处标记一下。
错误: 无法访问android.support.v7.app.AppCompatActivity
原因:编译的classpath未加入v4和v7库。
解决办法:javah -d jni -classpath D:\Android\sdk\extras\android\m2repository\com\android\support\appcompat-v7\23.2.0\appcompat-v7-23.2.0-sources.jar;….\build\intermediates\classes\debug com.glodon.ndk.MainActivity
将路径改为自己的路径,我的是在这里的
此处记录一下参考地址
http://blog.youkuaiyun.com/sodino/article/details/41946607
http://blog.youkuaiyun.com/yanbober/article/details/45309049