前言
我会在小专栏和简书一起分享。
上篇说了入门一个NDK程序,大致讲解了如何简单的使用ndk-build。
正题
首先新建一个Android项目,记得勾选“Include C++ support”。接着一直Next到Customize C++ Support页面,有两个勾选暂时用不到,先不勾选,这是定义模块依赖的C++功能,fexceptions和frtti。
最后点击finish就完成。
接着等待进去项目界面,我喜欢切换到Project模式看,跟普通项目多了cpp文件夹和CMakeLists.txt,.externalNativeBuild文件夹省略不看。
查看app下的build.gradle可以发现多了cmake标记,如果你前面勾选了,就会在cppFlags增加那两个C++功能模块。
然后我们来看代码MainActivity和native-lib.cpp,CMakeLists.txt
public class MainActivity extends AppCompatActivity {
// 加载'native-lib' so文件
static {
System.loadLibrary("native-lib");
}
@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(stringFromJNI());//使用native方法
}
/**
* 一个native方法,会在 'native-lib'中实现
*/
public native String stringFromJNI();
}
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
//实现java中stringFromJNI方法
Java_com_crayfish_cmakehello_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
//最小cmake版本
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib SHARED
src/main/cpp/native-lib.cpp )
find_library( log-lib log )
target_link_libraries(native-lib ${log-lib} )
CMakeLists中add-library是加载本地库,find_library是加载NDK库,target_link_libraries是关联库。
native-lib是so文件的名字,src/main/cpp/native-lib.cpp是对应c++文件。
STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用。
SHARED:动态库,会被动态链接,在运行时被加载。
MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用。
接下来,我们新增一个native方法
public native int IntegerFromJNI(int x,int y);
我们来完善一下C++中方法,记得自己加上“extern "C"”,不然会报错的。
extern "C"
JNIEXPORT jint JNICALL
Java_com_crayfish_cmakehello_MainActivity_IntegerFromJNI(JNIEnv *env, jobject instance, jint x, jint y) {
// TODO
return x + y;
}
如果你是要新增一个C++文件的话那么就修改CMakeLists.txt
add_library(native-lib SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/hello-lib.cpp )
结尾
大致内容到这里,有不足之处望大家指出。这两篇大致都是讲解了简单的建立项目,后面我会写一篇编译多个so文件。