本文共 1473 字,大约阅读时间需要 4 分钟。
编译通过讲解 Android.mk
讲解 native代码生成的so文件存放在手机的哪个目录
加载动态库,调用native代码:
//调用C代码
//1.加载.so文件
System.loadLibrary("atguigu");
//2.调用本地方法
String result = helloFromC();
System.out.println("result=="+result);
启动对应处理器(ARM)的模拟器:
运行工程:
输入结果如下:
调用成功
#include <string.h>
#include <jni.h>
jstring Java_cn_atguigu_ndk_DemoActivity_helloFromJNI(JNIEnv *env, jobject javaThis) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
只要改动C代码都需要重新编译,Java地方不需要改变。
public native String hello_From_C();
C语言中也需要修改成
jstring Java_com_atguigu_jnihelloworld_MainActivity_hello_From_C(JNIEnv* env,jobject obj){
// jstring (*NewStringUTF)(JNIEnv*, const char*);
char* text = "I am from C helle afu 123";
return (**env).NewStringUTF(env,text);
//return (*env)->NewStringUTF(env,text);
}
编译运行会报错
如果java方法中有下划线,需要在C代码方法下划线后面追加1
解决方案:在修改c代码如下:加1
jstring Java_com_atguigu_jnihelloworld_MainActivity_hello_1From_1C(JNIEnv* env,jobject obj){
// jstring (*NewStringUTF)(JNIEnv*, const char*);
char* text = "I am from C helle afu 123";
return (**env).NewStringUTF(env,text);
//return (*env)->NewStringUTF(env,text);
}
如果写成这样是不是很麻烦
public native String hello_111_2_5_hehe_From_C();
3.在当前控制台输入javah命令
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。