`
haierboos
  • 浏览: 436747 次
文章分类
社区版块
存档分类
最新评论

jni入门之javah自动生成jni的c文件所需头文件

 
阅读更多

javah是用来干嘛的呢?

它是用来生成C语音的头文件的。

通过一个helloworld看一下 javah的作用吧:


原来我们新建一个项目后,自己写C代码:

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

jstring Java_com_itheima15_ndk1_MainActivity_helloFromJNI(JNIEnv* env, jobject obj){

	//输出一个java字符串
	//返回一个java字符串
	//jstring     (*NewStringUTF)(JNIEnv*, const char*);
	char* cstr = "helloFromJNI";

	return (**env).NewStringUTF(env, cstr);

}

jstring Java_com_itheima15_ndk1_MainActivity_helloFromJNI(JNIEnv* env, jobject obj)
这个方法名要自己写,挺费劲吧,就算C++功底还算不错,写出一个,如果真到项目中,我们java中使用到了十几甚至几十个c方法,那就真的hi有的忙活了

javah就是给我们自动生成这玩意儿用的


下面介绍下使用方法:

新建一个android项目,我们先写布局和activity

布局,老规矩:一个按钮

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="调用C代码"
        android:onClick="click" />

</RelativeLayout>

activity里面写一个本地方法(这个是我们需要调用的本地方法)

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

public class MainActivity extends Activity {
	
	static{
		
		System.loadLibrary("Hello");
	}
	
	public native String hello();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View view){
    	//调用c代码
    	Toast.makeText(this, hello(), 0).show();
    	
    }
    
}

哦了之后呢,我们本来是要手动的去写这个C代码了,但是现在我们使用javah来生成这个所需的头文件

这个需要注意jdk1.6以下版本和jdk1.7版本是有一点不一样的

先说1.6版本

进入我们工程的bin目录下:执行 javah -jni + 写了调用c方法的那个类的class文件


1.7版本呢

进入我们工程的src目录下:执行 javah -jni + 写了调用c方法的那个类


然后到对应文件夹下就会生成一个对应的 h 文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_MainActivity */

#ifndef _Included_com_test_MainActivity
#define _Included_com_test_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_MainActivity
 * Method:    hello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_test_MainActivity_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

那接下来就方便了吧

开始根据这个头文件来写对应的c文件

#include <jni.h>
#include "com_test_MainActivity.h"//引入生成的头文件

#include <android/log.h>
#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 jstring JNICALL Java_com_test_MainActivity_hello
  (JNIEnv * env, jobject obj){

	//NewStringUTF()
	//return (**env).NewStringUTF(env, "您好 jni");

	LOGI("hello");
	LOGI("1");



	LOGI("2");



	return (**env).NewStringUTF(env, "您好 jni");

	LOGI("3");
}


接下来的步骤就和上一篇博文一样啦,交叉编译,后刷新工程,部署app即可

分享到:
评论

相关推荐

    JNI开发之javah生成静态和非静态的两个头文件区别代码

    JNI开发之javah生成静态和非静态的两个头文件区别

    JNI之Hello-JNI进阶

    4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 类名 5. 编写相应的.c文件(hello-jni.c) #...

    jni-example.zip

    上面自动生成的头文件中不含有参数,需要自己补齐。 5、完善工程目录上面的Android.mk ,加入so库相关的信息。这里有一个需要注意的地方: 在工程目录下面的Android.mk文件中的:LOCAL_JNI_SHARED_LIBRARIES := ...

    JNI文档资料源码_2020_01_22

    【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104068609 博客...

    JNI技术手册 c/c++调用java

    4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。 56 5) 生成动态库 56 6) 运行程序 java HelloWorld就ok. 56 四、 调用中考虑的问题 56 1) java和c是如何互通的? 57 2) 如何将java传入...

    Android JNI实例

    ①编写Java文件,编译成class文件,利用javah将class文件生成头文件。 ②编写c/c++文件,实现之前头文件中所定义的的函数。 ③编写Android.mk(自定义要编译的文件、标签等)和Application.mk(编译的架构)文件。 ...

    NDK09_JNI编译过程及AS新建一个JNI项目

    https://blog.csdn.net/baopengjian/article/details/104957181 1 新建项目 2 初始化 3 声明一个native 方法,生成.h头文件 4 实现.h定义的方法

    NDK开发的简单实例(JNI及Android的C组件实现)

    2、使用javah从JAVA类中转换成相应的头文件(已有genHeader.bat的脚本直接生成,其中的com.ex.sot.NativeDataManage是相应的类,需依据实现作修改) 3、实现相对应的*.c并调用C组件(在jni文件夹下) 3、使用C实现所需...

    JNI中文翻译

    ·编写带有native声明的方法的java类 ·使用javac命令编译所编写的java类 ·使用javah ?jni java类名生成扩展名为h的头文件 ·使用C/C++实现本地方法 ...·将C/C++编写的文件生成动态连接库 ·ok

    gradle-jni-plugin:用于从Gradle管理JNI代码的插件

    jdk :这是一个文件对象,应指向包含javah可执行文件的JDK。 classpath :将用于使用本机方法搜索类的类路径。 createdHeadersDir :这是将要生成的标头的输出目录。 classes :一个字符串列表,其中包含要搜索...

    java获取当前windows进程pid

    2.javah -jni PidTool ,生成.h头文件 3.编写.c文件实现函数功能 4. cl PidTool.c -FePidTool.dll -LD -I"D:\Development\Java\jdk1.6.0\include" -I"D:\Development\Java\jdk1.6.0\include\win32" ,生成dll文件,...

    用Java的JNI技术实现清屏功能

    注意:将Jdk安装环境include目录下的jawt_md.h jni_md.h jni.h三个头文件copy到 Microsoft Visual Studio的include目录下 cl -LD ClearScreen.cpp -FeClear.dll 其中 -LD create .dll -Fe name executable file

    lsn6_JNI的简单调用

    编写native 方法 复制.h 头文件到cpp 工程 实现.h 头文件中的声明函数 生成一个dll 动态库文件 在java中加载动态库

    Rust-Java-JNI:关于如何使用JNI(Java本机接口)将Rust和Java连接在一起的实验项目

    调用您的rust方法,例如生成的头文件中的方法 将rust二进制文件编译到库中 使用System.load(LIBRARY_PATH)将库加载到Java中 现在您可以访问本机方法 如何编译和运行 防锈项目: cargo build &gt;输出到目标/ 使用 ...

    word源码java-jniwebshell:jniwebshel​​l

    由于jni技术需要先通过javah+.class文件生成.h开头的c头文件,jsp是一种特殊的class文件,而jsp经过Tomcat编译class文件,命名遵从test.jsp -&gt;&gt; org.apache.jsp.test_jsp.class,所以我们需要新建package为org....

    scalatags_2.10-0.1.2.zip

    jni-headers-maven-plugin.zip,用于生成从Java调用的本地函数的C/C++头文件的Maven插件(使用Javah)

    ZGPlayer:一个播放器

    ZGPlayer 一个播放器,初步实现使用ffmpeg来解码。 视频解码:ffmpeg 视频渲染:android native window ffmpeg编译:使用ffmpeg-2.4.2+...在eclipse里面可以配置javah命令,然后选中java文件即可生成.h头文件了。 Run

    高焕堂<应用框架原理与程序设计>源代码(Eclipse)

    在Ex36CModel目录下创建Application.mk文件,并创建jni目录,该目录下包含Android.mk,HalfAdder.c等文件,目录结构如下 (关于MK文件的语法请看NDK安装目录docs下的ANDROID-MK.TXT,或者网上查找相关资料) Ex36C...

    ndk开发实战javap签名篇

    ndk开发者对于javah和javap必用的,是否无法获取到签名,是否无法根据java代码生成c/c++中的头文件呢,那么就下载这个能指导你倒争取的方向

Global site tag (gtag.js) - Google Analytics