android111 java中调用c代码

MainActivity:

package com.itheima.helloworld1;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    static{
        //加载打包完毕的so类库
        System.loadLibrary("hello");//hello是Abdroid.mk中指定的名字。
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    /*##使用jni
    1. 在项目根目录下创建jni文件夹
    2. 在jni文件中创建一个c文件(src是写java代码的)
    3. 在java代码中,创建一个本地方法helloFromC
            public native String helloFromC();
    4. 在jni中定义函数实现这个方法,函数名必须为
            jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
    5. 返回一个字符串,用c定义一个字符串
            char* cstr = "hello from c";
    6. 把c的字符串转换成java的字符串
            jstring jstr = (*env)->NewStringUTF(env, cstr);
            return jstr;
    7. 在jni中创建Android.mk文件
    8. 在c文件中添加<jni.h>头文件
    9. 在jni文件夹下执行ndk-build.cmd指令( 在磁盘jni文件夹下用cmd命令编译,编译完后在libs下的armeabi文件夹下有一个libhello.so文件,这就是编译后的c代码)
    10. java代码中加载so类库,调用本地方法*/

    public void click(View v){
        Toast.makeText(this, helloFromC(), 0).show();
    }

    //定义一个本地方法,方法体由c语言实现
    public native String helloFromC();

}

Android.mk

# mk是make的意思
 LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)
    #编译后生成的文件的类库叫什么名字
    LOCAL_MODULE    := hello
    #要编译的c文件
    LOCAL_SRC_FILES := Hello.c

    include $(BUILD_SHARED_LIBRARY)

Hello.c

#include <stdio.h>
#include <stdlib.h>
#include <jni.h>

//jstring表示string,Java_com_itheima_helloworld1_MainActivity_helloFromC是包名类名方法名
//JNIEnv* env, jobject obj是必须写的参数,env是java虚拟机的内存地址,java代码是运行在虚拟机的而C代码不是运行在虚拟机的,
//env本来就是一个结构体指针,此处* env是一个java运行环境的二级指针,obj是MainActivity对象,C中jobject表示对象。
jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj){
    //c语言的字符串不是string,是字符数组,char* cstr或者char cstr[],数组的名字就是第0个元素的地址,
    char* cstr = "hello from c";
    //把C语言的字符串转换成java的字符串
    // jstring     (*NewStringUTF)(JNIEnv*, const char*);
//    jstring jstr = (*(*env)).NewStringUTF(env, cstr);
    jstring jstr = (*env)->NewStringUTF(env, cstr);
    return jstr;
}

时间: 2025-01-13 00:54:47

android111 java中调用c代码的相关文章

如何在Java中调用Python代码

有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调用对方的代码”. 下面我将举一些简单的小例子,借此说明:如何在Java中调用Python代码. 看懂这篇文章只需要具备: 熟悉Java的基本语法 懂一点点Python 主要内容如下: 什么是Jython? 一个HelloPython程序 在Jvm中执行Python脚本 仅在Java中调用Python

Java中调用MatLab返回值

当在Java中使用MatLab函数时,由于语言语法的不同,Matlab返回多个数据时,想在Java中获取到并进行使用.查阅了网上资料,翻箱倒柜加上自己实战,得出方法如下: 如MatLab函数返回的是N个变量值,其中有单个的数值.一维数组.二维数组等. 在Java中,使用Object[] rs=cmatlab.matlabfun(n , ....);接受返回的参数.其中rs[k]代表返回列表中第k个返回的变量的值. 如果rs[k]是单个数值,比如Double型.则使用下面的方法转换为Java中的D

java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名.成员这个方式,因为静态成员是属于类的,并不是属于具体的对象 c#中     只能通过类名.成员调用,并不能 用实例来进行调用 2.c#的静态构造函数和java中的构造代码块.静态代码块 c# 静态构造函数的特点:        1)静态构造函数不需要手动调用,系统自动调用        2)静态构造

java中调用kettle转换文件

java中调用kettle转换文件 通过命令行也可以调用,然后java中调用命令行代码也可以:这样没有和java代码逻辑无缝集成.本文说明kettle5.1中如果通过其他API和java代码无缝集成:网上大多数资料都是低版本的,在kettle5.x中已经不能运行. 1.       需要哪些jar文件 以kettle开头的是必须,上图最下面三个也要:红色框中的两个是我测试转换用到的,分别是生成UUID和文件. 要是少了jar文件,运行程序一定报错,大家根据错误到kettle安装目录LIB中找相应

在java中调用python方法

1.http://sourceforge.net/projects/jython/下载jython包,把其中的jython.jar添加到工程目录 示例: 1.摘自:http://blog.csdn.net/anbo724/article/details/6608632 1.在java类中直接执行python语句 import javax.script.*; import org.python.util.PythonInterpreter; import java.io.*; import sta

Java中调用c/c++语言出现Exception in thread &quot;main&quot; java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V at Test.testPrint(Native Method) at Test.main(Test.java:8) 解决方法: 昨天一天都在想办法解决这个问题,操作步骤按照教程来的,怎么会出错呢?想了半天,觉得还是dll文件生成的不对.所以,最后决定把codeblocks换成visual

java中执行js代码

要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return a+b; } 然后在java中写代码: public class ZipTest { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineMa

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

批量扫描雏形之在Java中调用nmap进行主机探测

在Java中通过调用Runtime这个类可以执行其他的可执行程序,执行后返回一个进程(Process),利用Process这个类我们可以取得程序执行的回显,因此在Java中调用nmap进行主机探测的原理就很清晰了.通过给函数传递nmap所在路径和我们需要执行的命令即可 具体实现代码: /**  * 调用nmap进行扫描  * @param nmapDir nmap路径  * @param command 执行命令  *   * @return 执行回显  * */ public String g