环境
- Android Studio 3.0
- JDK 1.8
- Gradle 4.1
Demo地址:
https://github.com/seeways/NDKDemo
C++编译so库
创建项目
使用默认的C++支持库建立项目后,会默认生成一个模板,有一个简单的Cpp程序,和MainActivity调用示例
c++
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_test_ndkdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
java
//包名
package com.test.ndkdemo
//导入的包
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
//kotlin插件
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 调用示例
sample_text.text = stringFromJNI()
}
//一个本地方法,它由“本地库”本地库实现,它被打包在这个应用程序中。
external fun stringFromJNI(): String
companion object {
// 用于在应用程序启动时加载“native-lib”库
//相当于java的静态代码块。
init {
System.loadLibrary("native-lib")
}
}
}
以上是项目建立好之后的默认程序,C++没有像java一样的保姆,所以一般调用完了需要自己释放内存,比如要用到数据的话,一定要释放,否则估计几个回合程序就挂了。
接下来稍微改造一下程序
建立JNI类
package com.test.ndkdemo;
/**
* Created by TaoYuan on 2017/11/24 0024.
*/
public class MyJNI {
//调用so库声明
static {
System.loadLibrary("MyJNI");
}
/**
* 调用so库方法
*/
//输出字符串
public native String sayHello();
//输出 x + y 计算结果
public native int sum(int x, int y);
}
简历C++文件
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_test_ndkdemo_MyJNI_sayHello(JNIEnv *env, jobject instance) {
std::string say = "say 就 say!\n Hello";
return env->NewStringUTF(say.c_str());
}
extern "C" //表示对java输出
JNIEXPORT jint JNICALL
Java_com_test_ndkdemo_MyJNI_sum(JNIEnv *env, jobject instance, jint x, jint y) {
return x + y;
}
CMakeLists.txt文件(关键地方)
# 指定需要CMAKE的最小版本
cmake_minimum_required(VERSION 3.4.1)
# 添加库,参数为(库名称<自定义>,库模式<STATIC,SHARED>,路径)
add_library( # Sets the name of the library.
MyJNI
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/MyJNI.cpp )
# 指定目标库
target_link_libraries( # Specifies the target library.
MyJNI
# Links the target library to the log library
# included in the NDK.
${log-lib} )
modules build.gradle
android代码块下,加一句:
abiFilters 类型
externalNativeBuild {
cmake {
cppFlags ""
abiFilters 'armeabi','armeabi-v7a'
}
}
完成
make project即可生成
生成路径位于:${ProjectPath}\app\build\intermediates\cmake\debug\obj