用Jni+jar封装C++库给android调用

目标

将C++库通过Jni封装成Java接口,给Android调用

  • 实现方法:
    • 用Jni封装C++库,生成.so
    • Java代码调用.so中Jni接口
    • 将Java代码封装成jar包
    • 提供jar包和.so给其他Android工程调用,直接调用封装好的Java接口即可

一、新建native工程,生成.so

参考文章: AS 使用C++代码生成.so并导入

二 、新建module(androd library) c,生成jar包

参考文章: AS 3.5 生成和调用jar包

三、mylib中调用.so

修改app中native-lib.cpp代码:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
//Java_com_JniAndJar_MainActivity_stringFromJNI(  //修改为mylib中的MyFunc
Java_com_mylib_MyFunc_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

修改mylib中MyFunc代码:

package com.mylib;

import android.util.Log;

public class MyFunc {
    static { //新增
        System.loadLibrary("native-lib");
    }
    public static void ShowLog(String str)
    {
        Log.d("mylib==>>: ", str);
    }

    public void ShowJniLog(String str) //新增
    {
        Log.d("mylibJni ", str);
    }
    public native String stringFromJNI(); //新增
}

修改app中MainActivity代码:

ackage com.JniAndJar;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;
import com.mylib.MyFunc;
public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    //static { //删除
    //    System.loadLibrary("native-lib");
    //}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        //tv.setText(stringFromJNI()); //删除
        MyFunc.ShowLog("main ");
        MyFunc func = new MyFunc(); //新增
        func.ShowJniLog("main jni");
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    //public native String stringFromJNI(); //删除
}

然后运行,调试

四、生成调用jni的jar包

生成新的jar包

五、调用jar包和.so库

新建工程,调用jar包,和.so:
参考文章: AS 使用C++代码生成.so并导入
参考文章: AS 3.5 生成和调用jar包

将生成的新jar包,mysdk.jar拷贝到新工程的app->libs目录下,调用即可:

新工程的MainActivity 代码如下:

package com.JniAndJar;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;
import com.mylib.MyFunc;
public class MainActivity extends AppCompatActivity {
    //static{
    //    System.loadLibrary("native-lib");
    //}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = findViewById(R.id.my_text);
        //tv.setText(stringFromJNI());
        MyFunc.ShowLog("Use jar");
        MyFunc func = new MyFunc();
        func.ShowJniLog("Use Jar");
    }

    //public native String stringFromJNI();
}


版权声明:本文为rxs0011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。