使用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代码相关推荐

  1. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

  2. 在R中调用Java代码

    我们都知道Java语言长期处于霸主地位,在所有编程语言排行榜中,Java也是常年位居第一.在近几年也是爆炸式发展,几乎覆盖到了应用开发的所有领域.而R语言则在统计圈和数据可视化处于佼佼者,如果将Jav ...

  3. python中如何调用java_在Python程序中调用Java代码的实现

    有头发且有趣的码农万里挑一~ 14 有料叔 | 一位有故事的程序猿 前 言 开发Python程序,需求中需要用到Java码,Python作为"胶水"语言能够很好的实现这种需求.具体 ...

  4. jsp 调用java_jsp中调用java代码小结

    原封不动的传送给客户端有两个小例外: 1. 如果想传送 , 由于它跟jsp的特殊符号一致, 所以必须使用转义字符转义, 2. 如果想传送注释, 在 jsp 编辑页面中出现, 而在生成的html文档不出 ...

  5. python3调用java_Python程序中调用Java代码的实践

    1.环境准备 windows 7(64位)+JDK(64位)+Python(64位)+eclipse+pycharm 还需要一个作为桥梁的工具包,jpype1,这个工具包可以启动jvm,使java代码 ...

  6. python调用java文件_Python程序中调用Java代码的实践

    1.环境准备 windows 7(64位)+JDK(64位)+Python(64位)+eclipse+pycharm 还需要一个作为桥梁的工具包,jpype1,这个工具包可以启动jvm,使java代码 ...

  7. 在C#中调用Java代码

    到IKVM官方网站下载IKVM需要的组件 ikvm-0.40.0.1.zip ikvmbin-0.40.0.1.zip openjdk6-b12-stripped.zip 解压ikvm-0.40.0. ...

  8. Qt使用JNI调用Java代码—————附带完整示例

    文章目录 0 背景 1 调用准备 2 调用 2.1 调用方法 2.2 方法签名 2.3 调用示例 2.4 注意事项 3 完整示例代码 3.1 部分代码 3.2 附赠示例 0 背景 在开发Android ...

  9. Java中调用C++代码

    Java中调用C++代码 1.Idea创建一个Solution类 public class Solution {public native void sayHello();static{System. ...

  10. java调c++代码_Java中调用C++代码的实现 | 学步园

    JNI为  Java Native Interface 即Java本地接口,使用此种方式可以对C/C++代码进行调用,其在本质上是对C/C++生成的动态库进行调用而不是直接对C/C++代码进行调用 J ...

最新文章

  1. 创建oracle发邮件job导致的故障
  2. VisualSVN Crack
  3. 2.12.ECMAScript--运算符
  4. element走马灯自动_Element Carousel 走马灯的具体实现
  5. 全民超神VS王者荣耀:从角色养成到账户养成
  6. 树——通用树到二叉树的转换
  7. 7-7 旅游规划 (8 分)
  8. 一:HTTP协议(超详解)
  9. 中国1,2,4-三氟苯市场趋势报告、技术动态创新及市场预测
  10. macOS 系统重大安全漏洞:不用密码我也可以玩你的 Macbook
  11. Bugku-CTF之login3(SKCTF)(基于布尔的SQL盲注)
  12. 计算机存储单位和网速单位换算,数据速度计算:在线进行网速各种bps mbps kbps B/秒 KB/秒 MB/秒单位之间换算...
  13. 为什么网络钓鱼攻击仍然有利可图----以及如何阻止它
  14. windows下对python的pip更新到最新版本
  15. Python爬虫 煎蛋网全站妹子图爬虫
  16. 整理:图片文件管理工具类---ImageUtil
  17. windows下xshell操作Linux命令大全(及服务器日志查看)
  18. Unity3d 寻路功能 介绍及项目演示
  19. 【WebApi】————.net WebApi开发(一)
  20. 电台电视台使用频率最高的36首经典背景音乐

热门文章

  1. pdf.js跨域加载文件
  2. Angular动态注册组件(controller,service...)
  3. Java对证书的操作
  4. 【SpringBoot】整合MyBatis
  5. exists/not exists(2020-3-27)
  6. 大学计算机专业分流考试,北京林业大学计算机类(入学一年后分流至计算机科学与技术、数字媒体技术、网络工程、计算机科学与技术(物联网))专业2016年在江苏理科高考录取最低分数线...
  7. 什么是webpack? ----(webpack入门)
  8. idea如何操控git分支
  9. Java中继承方法的使用,以及使用方法的注意事项,继承方法重写的理解,白话文详解,简单易理解
  10. java 串行化 序列化_对象串行化 对象序列化