实现目标:
- 在android项目基础上创建出一个jni,不使用工具
- 一个最简单的例子
- 输出一句话,并且写清楚注释
创建
1.创建一个android项目
2.添加JNI支持
- 首先在Android下的build添加
//编译出来的平台
ndk {
abiFilters "arm64-v8a", "armeabi-v7a"
//abiFilters "armeabi-v7a"
}
- 添加配置文件地址
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
- CMAKE文件
#指明cmake的版本
cmake_minimum_required(VERSION 3.4.1)
add_library(
# 最总生成的so的名字
# SHARED STATIC: 动态 静态库
hello-jni
SHARED
hello-jni.cpp)
# Include libraries needed for hello-jni lib
# 编译链接 链接那些东西
target_link_libraries(hello-jni
android
log)
3.java代码
static {
System.loadLibrary("hello-jni");
}
native String showString();
4.jni代码
//extern “C”扩展c,使用我们这个创建的是cpp,所以是c++,c++如果有c的相关操作就需要
/**
*JNICALL:是一个栈,它用来存储函数参数的, 在Android中没有实现
*/
/**JNIEXPORT :Windows 中如果需要生成动态库 , 并且需要将该动态库交给其它项目使用 ,
需要在方法前加入特殊标识 , 才能 在外部 程序代码中 调用该 DLL 动态库中定义的方法 ;
在不同平台的实现是不同的
*/
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_demo_MainActivity_showString(JNIEnv *env, jobject thiz) {
// 输出一句话
char *str = "i am a pet!";
// 不可以直接返回str,需要转换为jstring
return env->NewStringUTF(str);
}
5,运行

参数说明
- 看一下JNIEnv
它是一个结构体
typedef _JNIEnv JNIEnv;
struct _JNIEnv;
struct _JNIEnv {
/* do not rename this; it does not seem to be entirely opaque */
const struct JNINativeInterface* functions;
#if defined(__cplusplus)
jint GetVersion()
和一些方法
- jobject
typedef _jobject* jobject;
网友评论