JNI初步(二)c调用java方法
程序员文章站
2022-06-17 22:16:18
1.写Jni类 并且在下面写好需要被c调用的方法方法体也写好public class Jni { { System.loadLibrary("cCallJava"); } public native int addCallBack(); public int add(int a, int b) { Log.i("godv", "a+b = " + a + b); return a + b; }}2.利....
1.写Jni类 并且在下面写好需要被c调用的方法方法体也写好
public class Jni {
{
System.loadLibrary("cCallJava");
}
public native int addCallBack();
public int add(int a, int b) {
Log.i("godv", "a+b = " + a + b);
return a + b;
}
}
2.利用 javah 生成对应的 .h 文件 并且新建 .c 文件实现callBack方法
注意引入头文件 #include "com_godv_ccalljava_Jni.h"
获取方法签名
我这里是在如径 AndroidStudioProjects\Hello\ccalljava\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes
执行 javap -s com.godv.ccalljava.Jni
方法签名如下:
#include "com_godv_ccalljava_Jni.h"
#include <android/log.h>
#define LOG_TAG "godv"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
JNIEXPORT jint JNICALL Java_com_godv_ccalljava_Jni_addCallBack
(JNIEnv * env, jobject jobj)
{
/**
* 用法 :获取java类的 字节码文件
* 参数1 :env
* 参数2 :路径
* 返回值 :jclass
*/
jclass jclazz = (*env)->FindClass(env,"com/godv/ccalljava/Jni");
/**
* 用法 :获取java方法的 methodid
* 参数1 :env
* 参数2 :字节码文件
* 参数3 :方法名
* 参数4 :方法签名
// AndroidStudioProjects\Hello\ccalljava\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes
* 返回值 :jmethodID
*/
jmethodID jids = (*env)->GetMethodID(env,jclazz,"add","(II)I");
/**
* 用法 : 获得java类实例
* 参数1 :env
* 参数2 :字节码文件
* 返回值 : jobject类型的 java实例对象
*/
jobject jni = (*env)->AllocObject(env,jclazz);
/**
* 用法 : jni 调用java方法
* 参数1 :env
* 参数2 :java类实例
* 参数3 : java方法ID
* 其余参数为 该java方法所需参数
*/
LOGD("返回值为 %d",6+7);
return (*env)->CallIntMethod(env,jni,jids,6,7);
}
3.在Java这面调用即可
public void add(View view) {
int i = jni.addCallBack();
Log.i("godv", "" + i);
}
注意 : 别忘了配置 ndk 配置log
ndk{
moduleName "cCallJava" //so 文件 lib+moduleName+.so
abiFilters 'armeabi' , 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' //cpu类型
ldLibs 'log'
}
一个c返回字符串的例子
JNIEXPORT jint JNICALL Java_com_godv_ccalljava_Jni_strCallBack
(JNIEnv * env, jobject jobj)
{
jclass jclazz = (*env)->FindClass(env,"com/godv/ccalljava/Jni");
jmethodID jids = (*env)->GetMethodID(env,jclazz,"str","(Ljava/lang/String;)V");
jobject jni = (*env)->AllocObject(env,jclazz);
jstring str = (**env).NewStringUTF(env,"Im godv !");
(*env)->CallVoidMethod(env,jni,jids,str);
}
public void str(String s) {
Log.i("godv", "c中输入的字符串为 = " + s);
}
一个调用静态方法的例子
JNIEXPORT void JNICALL Java_com_godv_ccalljava_Jni_staticCallBack
(JNIEnv * env, jobject jobj)
{
jclass jclazz = (*env)->FindClass(env,"com/godv/ccalljava/Jni");
jmethodID jids = (*env)->GetStaticMethodID(env,jclazz,"sta","(Ljava/lang/String;)V");
jstring str = (**env).NewStringUTF(env,"Im static godv !");
(*env)->CallStaticVoidMethod(env,jclazz,jids,str);
}
public static void sta(String s) {
Log.i("godv", "静态方法 : c中输入的字符串为 = " + s);
}
本文地址:https://blog.csdn.net/we1less/article/details/108694711
上一篇: Linux系统下修改mysql字符集为UTF8步骤
下一篇: 用python写一个福字(附完整代码)
推荐阅读
-
C#调用Java方法实例详解
-
windows和linux环境下java调用C++代码-JNI技术
-
Android JNI c/c++调用java的实例
-
c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法
-
JNI接口 创建一个Java调用C++实例 涉及JAVA与C++之间的参数传递问题
-
Unity通过NDK、JNI实现C#、java、C/C++之间的相互调用
-
Android JNI-c/c++调用java方法
-
安卓应用开发通过java调用c++ jni的图文使用方法
-
JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法
-
JNI初步(二)c调用java方法