jni c java_使用JNI在C中调用java代码
使用JNI在C中调用java代码
1.定义个类来定义java的native方法
public class DataProvider {
static{
System.loadLibrary("Hello");
}
public native void callCcode();
public native void callCcode2();
public native void callCcode3();
//C调用java空方法
public void helloFromJava(){
System.out.println("hello from java");
}
//C调用java中的带两个int参数的方法
public static int Add(int x,int y){
System.out.println("java "+ (x+y));
return x+y;
}
//C调用java中参数为string的方法
public void printString(String s){
System.out.println("java "+ s);
}
}
2.用javah编译那个native的类.
3.新建jni的文件夹.把刚刚编译生成的.h的头文件给拷贝进来.
4.在jni的文件夹下新建XX.c文件
5.编写c代码
#include
#include
#include "com_mccxxiv_ndk4_DemoActivity.h"
#include
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_com_mccxxiv_ndk4_DataProvider_callCcode
(JNIEnv * env, jobject obj){
// new 出来java的对象 然后调用java对象里面的方法
char* classname = "com/mccxxiv/ndk4/DataProvider";
jclass clazz; //定义一个java中的类
clazz = (*env)->FindClass(env,classname); //该方法返回一个类
if(clazz==0){
LOGI("CAN'T FIND CLAZZ ");
}else{
LOGI("FIND CLASS");
}
//该方法返回指定类中的指定方法
//最后一个参数是方法的签名.
//获取方法的签名是用dos进到工程的classes目录下用javap -s 包名+类名
jmethodID java_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");
if(java_method==0){
LOGI("CAN'T FIND java_method ");
}else{
LOGI("FIND java_method");
}
//调用java中无返回值的方法.第二个参数obj为类的对象.
//所以把native的方法放到和方法在同一个类中(DataProvider)
//如果native方法和c要调用的java方法不在同一个类中.在c代码中需调用AllocObject()方法来手动的指定obj对象
//方法的返回值不同调用的CallXXXMethod中的XXX不同.返回值是什么类型XXX就是什么.
//静态的方法也是一样的.XXX就是StaticXXX.少一个obj的参数.
(*env)->CallVoidMethod(env,obj,java_method);
}
JNIEXPORT void JNICALL Java_com_mccxxiv_ndk4_DataProvider_callCcode2
(JNIEnv * env, jobject obj){
char* classname = "com/mccxxiv/ndk4/DataProvider";
jclass clazz;
clazz = (*env)->FindClass(env,classname);
if(clazz==0){
LOGI("CAN'T FIND CLAZZ ");
}else{
LOGI("FIND CLASS");
}
jmethodID java_method = (*env)->GetMethodID(env,clazz,"Add","(II)I");
if(java_method==0){
LOGI("CAN'T FIND java_method ");
}else{
LOGI("FIND java_method");
}
jint result = (*env)->CallIntMethod(env,obj,java_method,5,8);
LOGI("c daima %d",result);
}
JNIEXPORT void JNICALL Java_com_mccxxiv_ndk4_DataProvider_callCcode3
(JNIEnv * env, jobject obj){
char* classname = "com/mccxxiv/ndk4/DataProvider";
jclass clazz;
clazz = (*env)->FindClass(env,classname);
if(clazz==0){
LOGI("CAN'T FIND CLAZZ ");
}else{
LOGI("FIND CLASS");
}
jmethodID java_method = (*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");
if(java_method==0){
LOGI("CAN'T FIND java_method ");
}else{
LOGI("FIND java_method");
}
(*env)->CallVoidMethod(env,obj,java_method,(*env)->NewStringUTF(env,"haha from c"));
}
6.在jni文件夹下新建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) #类似于工具初始化的操作
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
7.用ndk-build命令编译
8.在主Activity中调用native方法
public class DemoActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void click(View view){
DataProvider provider = new DataProvider();
provider.callCcode();
}
public void click2(View view){
DataProvider provider = new DataProvider();
provider.callCcode2();
}
public void click3(View view){
DataProvider provider = new DataProvider();
provider.callCcode3();
}
}
jni c java_使用JNI在C中调用java代码相关推荐
- matlab中调用java代码_Matlab中调用第三方Java代码
在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...
- 在R中调用Java代码
我们都知道Java语言长期处于霸主地位,在所有编程语言排行榜中,Java也是常年位居第一.在近几年也是爆炸式发展,几乎覆盖到了应用开发的所有领域.而R语言则在统计圈和数据可视化处于佼佼者,如果将Jav ...
- python中如何调用java_在Python程序中调用Java代码的实现
有头发且有趣的码农万里挑一~ 14 有料叔 | 一位有故事的程序猿 前 言 开发Python程序,需求中需要用到Java码,Python作为"胶水"语言能够很好的实现这种需求.具体 ...
- jsp 调用java_jsp中调用java代码小结
原封不动的传送给客户端有两个小例外: 1. 如果想传送 , 由于它跟jsp的特殊符号一致, 所以必须使用转义字符转义, 2. 如果想传送注释, 在 jsp 编辑页面中出现, 而在生成的html文档不出 ...
- python3调用java_Python程序中调用Java代码的实践
1.环境准备 windows 7(64位)+JDK(64位)+Python(64位)+eclipse+pycharm 还需要一个作为桥梁的工具包,jpype1,这个工具包可以启动jvm,使java代码 ...
- python调用java文件_Python程序中调用Java代码的实践
1.环境准备 windows 7(64位)+JDK(64位)+Python(64位)+eclipse+pycharm 还需要一个作为桥梁的工具包,jpype1,这个工具包可以启动jvm,使java代码 ...
- 在C#中调用Java代码
到IKVM官方网站下载IKVM需要的组件 ikvm-0.40.0.1.zip ikvmbin-0.40.0.1.zip openjdk6-b12-stripped.zip 解压ikvm-0.40.0. ...
- Qt使用JNI调用Java代码—————附带完整示例
文章目录 0 背景 1 调用准备 2 调用 2.1 调用方法 2.2 方法签名 2.3 调用示例 2.4 注意事项 3 完整示例代码 3.1 部分代码 3.2 附赠示例 0 背景 在开发Android ...
- Java中调用C++代码
Java中调用C++代码 1.Idea创建一个Solution类 public class Solution {public native void sayHello();static{System. ...
- java调c++代码_Java中调用C++代码的实现 | 学步园
JNI为 Java Native Interface 即Java本地接口,使用此种方式可以对C/C++代码进行调用,其在本质上是对C/C++生成的动态库进行调用而不是直接对C/C++代码进行调用 J ...
最新文章
- 创建oracle发邮件job导致的故障
- VisualSVN Crack
- 2.12.ECMAScript--运算符
- element走马灯自动_Element Carousel 走马灯的具体实现
- 全民超神VS王者荣耀:从角色养成到账户养成
- 树——通用树到二叉树的转换
- 7-7 旅游规划 (8 分)
- 一:HTTP协议(超详解)
- 中国1,2,4-三氟苯市场趋势报告、技术动态创新及市场预测
- macOS 系统重大安全漏洞:不用密码我也可以玩你的 Macbook
- Bugku-CTF之login3(SKCTF)(基于布尔的SQL盲注)
- 计算机存储单位和网速单位换算,数据速度计算:在线进行网速各种bps mbps kbps B/秒 KB/秒 MB/秒单位之间换算...
- 为什么网络钓鱼攻击仍然有利可图----以及如何阻止它
- windows下对python的pip更新到最新版本
- Python爬虫 煎蛋网全站妹子图爬虫
- 整理:图片文件管理工具类---ImageUtil
- windows下xshell操作Linux命令大全(及服务器日志查看)
- Unity3d 寻路功能 介绍及项目演示
- 【WebApi】————.net WebApi开发(一)
- 电台电视台使用频率最高的36首经典背景音乐
热门文章
- pdf.js跨域加载文件
- Angular动态注册组件(controller,service...)
- Java对证书的操作
- 【SpringBoot】整合MyBatis
- exists/not exists(2020-3-27)
- 大学计算机专业分流考试,北京林业大学计算机类(入学一年后分流至计算机科学与技术、数字媒体技术、网络工程、计算机科学与技术(物联网))专业2016年在江苏理科高考录取最低分数线...
- 什么是webpack? ----(webpack入门)
- idea如何操控git分支
- Java中继承方法的使用,以及使用方法的注意事项,继承方法重写的理解,白话文详解,简单易理解
- java 串行化 序列化_对象串行化 对象序列化