起因:
c++工程师给了一份c++项目源码,没给说明文档,就丢一份源码压缩包要安卓嵌一层jni生成so库用,我该拿这份源码的哪些文件来用?
抱怨自己:
以前都是c++那边给so库和.h文件,直接用很方便,现在给源码自己搞,感觉自己就残废了
研究:
稍微了解ndk的小伙伴应该清楚,使用c++源码的方式有两种,一种是直接新建支持c++的AS项目;AS3.0版本是这种界面
另一种当然是无命令行,纯界面配置的JNI,推荐链接:https://blog.csdn.net/chuhongcai/article/details/52558049
https://blog.csdn.net/ziyoutiankoong/article/details/79696279
然后呢???不管哪种都需要先配置一下环境
1.下载NDK
此处是我已经下载过后自动配置好路径了,如果没下载过,红色文字地方会有download ndk ,点击下载即可
2.设置那边下载LLDB和CMke(也可以省略步骤1,直接在2这边下载ndk)
3.都下载完了,配置NDK环境变量
然后启动cmd输入启动命令行,输入ndk-build,得到如下图所示即可
4.新建一个demo项目ndkdemo来记录JNI开发流程
AS3.0版本是勾选include c++界面
至此,项目成功跑起来,已经算是把ndk集成成功了
5.项目创建如果不是步骤4的方式,也没关系,打开gradle.properties文件,输入android.useDeprecatedDdk=true
然后自己再配置.cpp文件、CMakeList.txt、build.gradle文件等等就行了
鱿鱼我这边c方法太多,我自己的项目是选择使用jni界面配置方式,使用c++源码,生成so库然后调用方式,下面简单记录下笔记
直接找给源码的c++工程师问哪些文件是对so库生成有用到的,一个都不能落下
1.跟着上面链接或者自己找的文章配置好File->Setting->External tool上面三个javah 、ndk-build、ndk-build clean这三个命令。
2.整个demo目录格式如图,新建jni文件夹
新建Android.mk文件
其中MyLibrary为要生成的so库名称,生成之后即为libMyLibrary.so
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyLibrary
LOCAL_SRC_FILES =: MyLibrary.cpp
include $(BUILD_SHARED_LIBRARY)
新建Application.mk文件
其中MyLibrary为要生成的so库名称,生成之后即为libMyLibrary.so
APP_MODULES := MyLibrary
APP_ABI := all
新建MyNdk.class
public class MyNdk {
public MyNdk(){
// static { //两种调用方式都行
System.loadLibrary("MyLibrary");
}
//自己定义的方法 正常应该是c/c++对外开放的方法名称
public native String getString();
//自己定义的方法 正常应该是c/c++对外开放的方法名称
public native String getMyString();
}
生成.h头文件,即com_keytop_ndkbuilddemo_MyNdk.h
根据图片操作自动生成以下代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_keytop_ndkbuilddemo_MyNdk */
#ifndef _Included_com_keytop_ndkbuilddemo_MyNdk
#define _Included_com_keytop_ndkbuilddemo_MyNdk
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_keytop_ndkbuilddemo_MyNdk
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getString
(JNIEnv *, jobject);
JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getMyString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
新建MyLibrary.cpp文件
#include "com_keytop_ndkbuilddemo_MyNdk.h"
JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getString
(JNIEnv * env, jobject obj){
return (*env).NewStringUTF("This is mylibrary !!!");
}
JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getMyString
(JNIEnv * env, jobject obj){
return (*env).NewStringUTF("getMyString success !!!");
}
app下面build.gradle文件下
android{
……
ndk{
moduleName "MyLibrary"
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}
}
最后一步,生成so库
代码调用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyNdk myNdk = new MyNdk();
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText( myNdk.getMyString());
}
}