刚刚学了NDK与JNI,肯定是用来调用c\c++文件的,接下来,就给大家带来一种很简单的嵌入式调用C|C++文件的一种方法
新建一个工程
在main文件夹下新建一个目录jni
在jni目录下新建一个文件 hello-jni.c
在hello-jni.c 中编写c代码
#include <jni.h>
//jstring: 返回值类型 String
//规则: Java_包名_类名_方法名(jvm虚拟机的指针,调用者对象)
jstring Java_com_lhy_jnidemo01_MainActivity_helloFromC(JNIEnv* env,jobject thiz){
return (*env)->NewStringUTF(env, "你好,我来自C代码 !!!");
}
在jni目录下新建Android.mk文件
添加如下内容::
#指定编译的文件夹 指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE := hello-jni
# 编译的源代码的名称
LOCAL_SRC_FILES := hello-jni.c
#编译一个动态库,静态库
#静态库 文件名.a 包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so 包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)
在build.gradle中配置
externalNativeBuild {
ndkBuild {
path file("src\\main\\jni\\Android.mk")
}
}
点击 Make Project(或Ctrl+F9) 即可生成.so文件
.so文件的路径: app\build\intermediates\ndk-build
好了,到这你的so文件已经生成了,这种方法很简单,
接下来我们来调用c文件里的方法,简单的运行一下。public class NdkJniUtils {
public native int add(int a,int b);
}
static{
//System.loadLibrary("库文件名称不带前缀,后缀名");
System.loadLibrary("hello-jni");
}
2、在MainActivity中调用
NdkJniUtils
package rise.lung.sow.dra.ndkjni_text;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
NdkJniUtils ndkJniUtils;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
ndkJniUtils = new NdkJniUtils();
int add = ndkJniUtils.add(2, 6);
tv.setText(add+"");
}
}
好了,到这里就完成了,运行就可以显示出结果了。
谢谢~~~