环境

Android Studio 3.0

JDK 1.8

Gradle 4.1

Demo地址:

C++编译so库

创建项目

使用默认的C++支持库建立项目后,会默认生成一个模板,有一个简单的Cpp程序,和MainActivity调用示例

c++

#include

#include

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

#include

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)

# 添加库,参数为(库名称,库模式,路径)

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

[图片上传失败...(image-26ce6f-1511769195490)]

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐