环境
- Android Studio 3.0
- JDK 1.8
- Gradle 4.1
Demo地址:
https://github.com/seeways/NDKDemo
C++编译so库
http://blog.csdn.net/lftaoyuan/article/details/78645814
C编译so库
创建项目
C++编译so库中已经有了创建后的示例,不多赘述。
建立MyJNI类
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);
//接收byte数组,输出json信息
public native String receiveYUV(byte[] bytes);
}
然后make project,这是在C++同一个项目下生成的,所以先忽略cmake生成的文件,
设置快速工具,当然也可以直接用命令,如果不怕麻烦的话
[图片上传失败...(image-c9c96c-1511777538224)]
[图片上传失败...(image-dc9f0d-1511777538224)]
-
javah
-
Program:
$JDKPath$\bin\javah.exe
-
Parameters:
-classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
-
Working directory:
$ModuleFileDir$\src\main\Java
-
Program:
-
ndk-build
-
Program:
你的ndk地址\ndk-build.cmd
-
Working directory:
$ProjectFileDir$\app\src\main
-
Program:
生成后,会出现jni文件夹,里面有根据MyJNI生成的头文件,然后新建C文件就可以写C代码了
可以考虑直接把头文件里的方法名直接复制过来,然后编写逻辑
//
// Created by TaoYuan on 2017/11/24 0024.
//
#include "com_test_ndkdemo_MyJNI.h"
JNIEXPORT jstring JNICALL Java_com_cyyz_ndkdemo_MyJNI_sayHello(JNIEnv *env, jobject instance){
return (*env)->NewStringUTF(env,"say 就 say!\n Hello");
}
JNIEXPORT jint JNICALL Java_com_cyyz_ndkdemo_MyJNI_sum(JNIEnv *env, jobject instance, jint x, jint y){
return x + y;
}
JNIEXPORT jstring JNICALL
Java_com_test_ndkdemo_MyJNI_receiveYUV(JNIEnv *env, jobject instance, jbyteArray bytes_) {
jbyte *bytes = (*env)->GetByteArrayElements(env, bytes_, NULL);
if (bytes == NULL) {
return 0; /* exception occurred */
}
//do something...
char *say = "输出的json数据";
(*env)->ReleaseByteArrayElements(env, bytes_, bytes, 0);
return (*env)->NewStringUTF(env, say);
}
配置gradle
modules build.gradle
- moduleName:so名称
- abiFilters:cpu架构
- ldLibs:连接库
- cFlags:编译选项,C++里是cppFlags
- stl: C++运行库
ndk{
moduleName "MyJNI"
abiFilters "armeabi","armeabi-v7a"
}
生成makefile
- make project
${ProjectPath}\app\build\intermediates\ndk下会生成Android.mk
- copy到jni文件夹下
用刚才配置的ndk-build构建Android.mk
- finish
[图片上传失败...(image-ae357e-1511777538224)]
网友评论