1.在环境变量中配置NDK,在local.properties中添加ndk.dir = "ndk的路径",然后下图中变成该版本号
2.在Java/包名文件夹下,新建NDKTest.java,代码如下:
package com.example.computer;
public class NdkTest {
static{
System.loadLibrary("native-jni");
}
long nativeComputer;
public NdkTest(){
nativeComputer = createNativeObject();
}
public void setAddRes(int a,int b){
setAddRes(nativeComputer,a,b);
return;
}
public int getRes(){
return getRes(nativeComputer);
}
private native long createNativeObject();
private native void setAddRes(long addr,int a,int b);
private native int getRes(long addr);
}
3.在java的同级目录,新建文件夹jni,新建computer类(即computer.h和computer.cpp)
computer.h
#ifndef COMPUTER_COMPUTER_H
#define COMPUTER_COMPUTER_H
class Computer {
private:
int res;
public:
Computer(){};
void setAddRes(int a,int b);
int getRes();
};
#endif //COMPUTER_COMPUTER_H
computer.cpp
#include "computer.h"
#include <jni.h>
extern "C"
JNIEXPORT jlong JNICALL
Java_com_example_computer_NdkTest_createNativeObject(JNIEnv *env, jobject thiz) {
// TODO: implement createNativeObject()
jlong result;
result = (jlong)new Computer();
return result;
}
extern "C"
JNIEXPORT void JNICALL
Java_com_example_computer_NdkTest_setAddRes(JNIEnv* env,jobject thiz, jlong addr,jint a, jint b) {
// TODO: implement setAddRes()
((Computer*)addr)->setAddRes(a,b);
}
extern "C"
JNIEXPORT jint
JNICALL Java_com_example_computer_NdkTest_getRes(JNIEnv * env, jobject thiz, jlong addr) {
// TODO: implement getRes()
return ((Computer*)addr)->getRes();
}
void Computer::setAddRes(int a, int b) {
this->res = a+b;
}
int Computer::getRes() {
return this->res;
}
在添加Android.mk和Application.mk文件
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-jni
LOCAL_SRC_FILES := computer.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_MODULES := native-jni
APP_ABI := all
最终目录结构,如下图所示
4.进入jni文件夹下,终端键入ndk-build,在同级目录下生成lib和obj文件夹,在obj文件夹下便有各个系统的.so库文件
在app文件夹中的build.gradle文件中,会自动添加(为什么,起什么作用,俺还不懂)
sourceSets {
main {
jni {
srcDirs 'src\\main\\jni'
}
}
}
5.在主函数MainActivity.java中调用,即可
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
textView = findViewById(R.id.tv_info);
NdkTest ndkTest = new NdkTest();
ndkTest.setAddRes(1,7);
textView.setText("result:"+ndkTest.getRes());
}