针对Android Studio工具
一、新建一个project,再新建一个java.class文件TestJni,如下图添加代码
package com.example.byc.testndk;
/**
* Created by byc on 2017/10/19.
*/
public class TestJni {
public native String getStringFromNative();
}
二、在MainActivity中添加调用native方法的代码
package com.example.byc.testndk;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TestJni testJni;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
testJni = new TestJni();
tv.setText(testJni.getStringFromNative());
}
}
三、build project 得到中间文件.class,路径:
app\build\intermediates\classes\debug
根据生成的.class文件,用javah生成.h文件,进入Terminal界面,默认路径是...app,进入...build\intermediates\classes\debug路径执行:
javah -jni com.example.byc.testndk.TestJni
执行完后会在此目录下生成.h文件
com_example_byc_testndk_TestJni.h
四、在main目录下新建一个jni目录,把第三步中的.h文件剪切里面,新建一个.c文件,代码如下:
#include "com_example_byc_testndk_TestJni.h"
/*
* Class: com_example_byc_testndk_TestJni
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_byc_testndk_TestJni_getStringFromNative
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
}
五、在project structure-->SDK Location中设置NDK的路径,如下图,或是在local.properties中添加如下代码:
ndk.dir=C\:\\Users\\byc\\AppData\\Local\\Android\\Sdk\\ndk-bundle sdk.dir=C\:\\Users\\byc\\AppData\\Local\\Android\\Sdk
六、module的build.gradle文件,在defaultConfig中添加:
defaultConfig {
...
ndk{
moduleName "TestJniLib"
abiFilters "armeabi","armeabi-v7a","x86" //输出指定三种abi体系结构下的.so库
}
}
七、在MainActivity中添加显示代码即可。要添加库的引用
public class MainActivity extends AppCompatActivity {
static{
System.loadLibrary("TestJniLib");
}
private TestJni testJni;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
testJni = new TestJni();
tv.setText(testJni.getStringFromNative());
}
}
遇到的问题:
一、java.io.IOException: Could not delete path ...build\intermediates\classes\debug
解决方案:因为上面操作时在Terminal界面路径还是上面报错的路径,退回到...app下即可
二、cannot resolve corresponding JNI function...
错误用法:1.File--->Settings--->Plugins,将Android NDK Support后面的对勾去掉,重新启动Android Studio
解决方案:
三、Your project contains C++ files but it is not using a supported native build system
解决方案: