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"
}
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