NDK开发c调用java代码(四)

c调用java代码
1.写JNI类
public class JNI {
    static {
        System.loadLibrary("cCallJava");
    }
    /*
    *
    * callbacSayHello()方法的目的是,触发c代码,让c代码代用sayHello()方法
    * */
   
    public native void callbacSayHello();


    public static void sayHello(String s){
        Log.i("我是java代码中的JNI----","java中的sayHello(string s)静态方法,我被c调用了:"+s);
    }
}
2.生成对应的c代码的头文件,先build一下
在main下创建jni目录 创建c文件 new File xxx.c
先build一下
选中JNI类右键copy Reference 获取JNI全类名
点击java目录右键,show in Explore ,然后点击,进入java目录下,shift+右键,在此处打开命令窗口,javah 全类名,然后将生成的。h文件移动到jni目录下
创建c代码文件,将.h中的方法复制到相应的c代码中,,进行实现,首先将参数补全,如:
JNIEXPORT void JNICALL Java_www_basketi_cn_basketball_ccalljavademo_JNI_callbackHelloFromJava
  (JNIEnv * env, jobject jb){


//在此处实现c代码
//1.得到字节码  参数二是JNI的全类名  .改成/
jclass jclazz=(*env)->FindClass(env,"www/basketi/cn/basketball/ccalljavademo/JNI");
//2.得到的对应的方法 参数三是c要掉用JNI中的方法 参数四是该方法的签名
jmethodID jmethodIDs=(*env)->GetMethodID(env,jclazz,"helloFromJava","()V");
//3.实例化JNI对象
jobject jobject=(*env)->AllocObject(env,jclazz);
//4.调用方法
(*env)->CallVoidMethod(env,jobject,jmethodIDs);
};


3.方法签名的获取
进入项目中的build\intermediates/classes/debug目录中,首先要build一下,- 右键show in explore -  按住shift + 右键- 在此处打开命令窗口 - javap -s 包名.JNI  回车
4.配置生成库的名称
配置生成库的名称:
在build.gradle中:
  defaultConfig {
        applicationId "www.basketi.cn.basketball.ccalljavademo"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        ndk{
            moduleName "cCallJava"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
        ndk{
            ldLibs "log"
        }
    }
5.加载动态库:
可以在JNI类中加入静态代码块:
  static {
        System.loadLibrary("cCallJava");
    }


6.调用方法
new JNI.callbackSayHello();当调用此方法的时候,就会调用c代码,c就会调用java代码,注:native方法是用来调用c代码的


备注:直接使用.so文件
1.拷贝.so文件到当前工程的main/jniLibs目录下
2.不需要配置
ndk{
            moduleName "cCallJava"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

3.c代码也不需要写了

源码下载位置:http://download.csdn.net/detail/lzq520210/9733668

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值