android studio jni简单实例,适合新手(需要用到CMakeList文件)
首先感谢博主工匠若水的文章:
地址:http://blog.****.net/yanbober/article/details/45309049/
本人新手,如有错误,敬请指正。
初次使用android studio配置jni的时候,网上找了很多关于配置jni的博文,其中一篇就是工匠若水的博文,按照上面的步骤一步一步来,结果还是出现如下错误:
NT SERVICE\TrustedInstaller
Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or ndk-build integration. For more information, go to:
https://d.android.com/r/studio-ui/add-native-code.html
Alternatively, you can use the experimental plugin:
研究了半天,发现可以配置CMakeList文件来解决这个错误。
具体步骤:
(PS:以下步骤跟上述博文的步骤有差异)
1.ndk不用特地下载,只要通过AndroidSDK下载就好。
2.打开Android Studio,新建一个项目,注意这里需要在第一个界面对Include C++ support打上勾,其他默认。
3.项目新建完成后,AS已经自动在app目录下新建一个native-lib.cpp,运行项目的时候就会调用文件内的Java_com_bin_cmakelist_MainActivity_stringFromJNI函数,在模拟器上显示"Hello from C++"。当然,这里我们要自己新建一个cpp文件。
4.新建一个JniUtils类,并写如下静态方法。helloFromC会报红字,先不管它
public class JniUtils {
public static native String helloFromC(); }
5.标题栏:Build->Rebuild Project,编辑后的文件会在project视图下出现classes\debug文件下
6.点开AS的Terminal标签,通过cd命令进入到进入到该项目的app文件夹下
E:\androidproject\test\JniTest>cd app\build\intermediates\classes\debug输入javah -jni 命令生成h文件
E:\androidproject\test\JniTest\app\build\intermediates\classes\debug>javah -jni com.bin.jnitest.JniUtil
执行完后可以在下JniTest\app\build\intermediates\classes\debug看见生成的 .h头文件
7.新建一个名为jni的文件夹,然后把刚才生成的.h头文件拷贝进刚创建的jni文件夹下。
8.在jin文件夹下创建Hello.cpp源文件(名字随意),内容如下:
#include "com_bin_jnitest_JniUtils.h" JNIEXPORT jstring JNICALL Java_com_bin_jnitest_JniUtils_helloFromC (JNIEnv *env, jclass obj){ return env->NewStringUTF("This just a test for Android Studio NDK JNI developer!"); }
#include "com_bin_jnitest_JniUtils.h"里引用的就是刚刚创建的头文件
函数名从头文件那里复制就好了
以上步骤与基本和引用博文一样,差异在下一步:
点开app下的CMakeList文件,在里面写上如下代码
add_library( # Sets the name of the library. Hello # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/jni/Hello.cpp )第二行是生成的so名字,可以随意命名
最后一行是c++文件所在目录
最后,在MainActivity修改一下代码代码(蓝色字体是修改部分)
// Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } static { System.loadLibrary("Hello"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(JniUtils.helloFromC()); // tv.setText(stringFromJNI()); }
输出结果如下
总结一下,其实也就是在原来博文的基础上就是对CMakeList加上一小段代码而已,代码也不是很难理解。而且我们并不需要像所引用博文一样,对gradle.properties,app/build.gradle和local.properties进行修改。