一,Android studio2.2+以上版本
2.2以上版本默认是配置了NDK的。在你android SDK目录下的ndk-bundle下。
在我们项目下的local.properties下已经配置好NDK路径了,如下(我的路径)
ndk.dir=C:\forwork\java\Android\sdk\ndk-bundle
sdk.dir=C:\forwork\java\Android\sdk
新建工程,如下图,勾选红框选项c++ suport
勾选了以后我们会发现新建的工程已经给我们配置好了NDK所需的环境,并且给我们建好了一个JNI的简单例子。
因为我也勾选了kotlin support所以新建的项目是kotlin格式的。
我们会发现在新建的项目中已经有了,native方法,和一个library直接运行,调用的就是cpp里面的方法返回的String 字符串。
二,创建自己的library
public class NativeActivity extends AppCompatActivity {
static {
System.loadLibrary("native-activity");
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.sample_text);
textView.setText(helloFromC());
}
public native String helloFromC();
}
我们新建一个Activity 并在里面创建自己的native方法helloFormC()。这个时候会报错,因为没有这个方法,不用管,接下来生成我们自己的.h文件。
打开android studio 的Terminal控制台,cd 到java目录下 输入命令:javah -d ../jni -jni com.xp.vedio.NativeActivity
“-d”后面是要生成文件的目录,jni后面是要生成的文件名字。回车以后 会在jni目录下生成我们需要的.h文件,发现之前的报错没有了。
然后根据.h文件,写我们需要的.cpp文件,跟.h文件对应,.cpp文件才是真正的方法实体文件。
#include <jni.h>
#include <string>
#include "com_xp_vedio_NativeActivity.h"
extern "C" JNIEXPORT jstring
JNICALL
Java_com_xp_vedio_NativeActivity_helloFromC(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++ as NativeActivity";
return env->NewStringUTF(hello.c_str());
}
.cpp文件的方法名和.h文件是对应的。后面发现不要.h文件也是可以的。好处可能是方便些.cpp文件方法把,毕竟.h是生成的。
最后一步:
在项目的CMakeLists.txt文件,这个是新建项目的时候,自动给你生成的。我们需要在这个文件下加入我们的.cpp文件,让他自己编译。改文件已经给了我们很友好的提示。
add_library( # Sets the name of the library.
native-activity
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/jni/native-activity.cpp )
第一行使我们的.cpp文件名字,第二行分享改文件,第三行文件路径。
target_link_libraries( # Specifies the target library.
native-lib
native-activity
# Links the target library to the log library
# included in the NDK.
${log-lib} )
在target_link_libraries加入自己的.cpp文件。然后运行,就可以了。
如果不加入的上面东西的话,会造成找不到对应的.so文件,会报错。
最后点击studio的Build–》Make project会生成apk文件。点击双击apk文件
对应的.so文件已经生成,并且打包在apk文件中。
运行,大功告成。
之前因为NDK编译的各种麻烦,都懒得去弄,现在发现android 对于 NDK的支持越来越好了。