1. 创建变通的 android 项目(项目路径E:\android\demo\HelloJNI)
2. 用Java代码声明native 接口,并在Java中调用,如:
public class MainActivity extends Activity {
static{
System.loadLibrary("hello-jni");
}
public native String getStringFramNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView)findViewById(R.id.text_view);
tv.setText(getStringFramNative());
}
}
3. Ctrl+F9编译项目,在以下目录会生成 class文件
E:\android\demo\HelloJNI\app\build\intermediates\classes\debug\com\example\csx\hellojni
4. 使用javah生成C/C++头文件
javah -d jni -classpath "d:\Dev\Android\android-sdk\platforms\android-23\android.jar";"E:\android\demo\HelloJNI\app\build\intermediates\classes\debug" com.example.csx.hellojni.MainActivity
其中
-d jni 指定生成的C/C++头文件输出目录为jni
-classpath "d:\Dev\Android\android-sdk\platforms\android-23\android.jar";"E:\android\demo\HelloJNI\app\build\intermediates\classes\debug" 指定加载类的路径,这里包含了android的类,还有我们项目生成的类的目录
com.example.csx.hellojni.MainActivity 是包路径,从这里生成C/C++头文件
5. 手动添加C/C++源文件,包含生成的头文件,实现头文件声明的函数。例如添加hello-jni.cpp源文件,实现代码如下:
#include "com_example_csx_hellojni_MainActivity.h"
jstring JNICALL Java_com_example_csx_hellojni_MainActivity_getStringFramNative(JNIEnv * env, jobject)
{
return env->NewStringUTF("Hello from JNI");
}
6. 要让Android Studio 支持C++源码的编译,需要修改gradle
a. 在gradle.properties 中添加 android.useDeprecatedNdk=true
b. 找到 app 的 build.gradle,在 defaultConfig中添加 ndk配置
ndk {
moduleName "hello-jni"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
7,再 Ctrl + F9 编译,就可以以下目录生成 so 文件
E:\android\demo\HelloJNI\app\build\intermediates\ndk\debug\lib