1 新建一个android项目
在新建的项目中新建类JniTest,并在类中编写native方法。
2 使用cmd命令生成.h文件
我的teminal不能用了 我擦,所以我用的cmd。
首先rebuild project一下。然后会看到build下生成的classes文件夹。
使用doc命令,首先切换到debug的目录下。
cd D:\Development\StudioProject\Application\app20-ndk\build\intermediates\classes\debug
然后使用命令
javah -jni -classpath . com.yeliang.app20_ndk.JniTest
然后会发现生成的.h
.h文件内容
3 编写c代码
在main文件夹下新建jni文件夹,并把JniTest.h文件拷贝到此文件夹下
新建c文件
把刚才的.h文件中的方法拷贝到此,并实现
此方法只是简单的返回了一个字符串。
4 加载so库
在gradle中加如下配置
ndk{
moduleName "yeliang-so-name" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
注意放到defaultConfig中:
在JniTest中添加如下代码
static{
System.loadLibrary("yeliang-so-name");
}
在gradle.properties中添加如下
android.useDeprecatedNdk=true
5 调用so库中的内容
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView)findViewById(R.id.tv);
textView.setText(JniTest.setText());
}
}
运行结果
会看到生成的so
如果遇到错误:
意思是没有声明此项目支持ndk,需要在gradle(Project)中配置这一句话
android.useDeprecatedNdk=true
如果遇到错误;
Error:Execution failed for task ':app:incrementalDebugJavaCompilationSafeguard'.
> java.io.IOException: Could not delete path app\build\intermediates\classes\debug'.
说明在rebuild时候,无法删除你的build下的文件。可能你在别的地方打开了此文件。比如cmd。之前不是在cmd中切换到debug目录下,用于生成.h。所以此时你需要关闭打开你文件夹的应用。然后重新rebuild。