先介绍下我的软件环境
android studio 1.5
ndk r10e,
gradle-experimental:0.6.0-beta5 (top-level build.gradle)
gradle-2.10-all.zip(gradle/wrapper/gradle-wrapper.properties)
app.gradle,红色字体为修改部分
apply plugin: 'com.android.model.application'
model{
android {
compileSdkVersion=23
buildToolsVersion="23.0.1"
defaultConfig {
applicationId "com.example.user.myapplication"
minSdkVersion.apiLevel 14
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
ndk {
moduleName "HelloNDK"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file("proguard-rules.pro"))
}
}
// Configures source set directory.
sources {
main {
java {
source {
srcDir "src"
}
}
}
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.1.1'
}
还需要在local.properties文件中设置ndk路径,如下,具体路径根据你安装的ndk路径而定
ndk.dir=C:\Users\Administrator\AppData\Local\Android\Ndk\android-ndk-r10e
sdk.dir=C:\Users\Administrator\AppData\Local\Android\Sdk
也可以右键项目名称,选择open modules setting(F4),然后选择SDK Location项,然后设置android NDK Location项的值,效果是一样的。
然后main右键——New——folder——JNI Folder添加jni文件夹,所有.c/.c++文件都应该放到此处.当前版本的NDK有bug,所以需要先在这个文件夹内生产一个空的c文件,
jni文件夹右键——New——C/C++ Source File——Name栏可以任意输入,type栏选择文件类型,然后ok确认之后自动生成.c和.h文件,不需要改动内容.
至此环境已经搭建完成。
然后是测试例子,这里在MainActivity中测试
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("HelloNDK"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tv); tv.setText(this.get()); } public native String get(); public native void set(String str); }
onCreate就是用一个文本框来显示从C方法里面返回的值。关键点在红色字体部分,其中System.loadLibrary("HelloNDK")是用来加载C库,public native String get();public native void set(String str);两个方法则是声明C库里面有这2个方法.当然现在jni文件夹里面并没有HelloNDK.c这个文件,所以会提示错误,这时只要选中方法名,然后alt+enter,然后选择Create funcation XXX,就会在jni文件夹中自动生成HelloNDK.c文件,该文件里面会自动生成符合jni规则的对应C方法,然后只需要实现该方法体,就完成了简单的ndk实例.
HelloNDK.c文件内容如下,红色字体为手动修改部分,其余部分均为自动生成
#include <jni.h> JNIEXPORT jstring JNICALL Java_main_java_com_sunyang_ndkapplication_MainActivity_get(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "hello ndk"); } JNIEXPORT void JNICALL Java_main_java_com_sunyang_ndkapplication_MainActivity_set(JNIEnv *env, jobject instance, jstring str_) { const char *str = (*env)->GetStringUTFChars(env, str_, 0); // TODO (*env)->ReleaseStringUTFChars(env, str_, str); }
完成之后运行,手机界面上的TextView应该会显示hello ndk.
至此环境搭建和实例测试结束从使用体验上来看,使用NDK来调用jni十分简单,开发时只需要把精力集中在代码逻辑上,不用去做繁琐的设置。期待正式版本的到来.