Android 下 JNI 开发

6、java代码load动态库.调用native代码

 

 

 

编译通过讲解 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)

 

 

04_javah 生成头文件-15

1_采用这个方法(**env).NewStringUTF(env,text)

  只要改动C代码都需要重新编译,Java地方不需要改变。

2_修改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命令

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值