Android中通过jni调用C++

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());
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值