文章目录
目标
将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版权协议,转载请附上原文出处链接和本声明。