NDK学习笔记<二> 使用javah生成头文件

上篇文章中,我们C文件代码中的函数名是手动书写的,这次我们来尝试使用javah生成我们需要的函数名

一、我们新建一个普通的安卓项目,这里我取名为ndk_02,添加MainActivity

package com.shi.androidstudy.ndk;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    public void onClick(View view){
        Toast.makeText(this, useJavah(), Toast.LENGTH_SHORT).show();
    }

    public native String useJavah();

    static {
        // 导入动态库
        System.loadLibrary("javah");
    }
}

二、打开当前包名的根目录,按住shift键,点击鼠标右键,打开命令行,
输入javah com.shi.androidstudy.ndk.MainActivity,
会在当前目录下面生成一个com_shi_androidstudy_ndk_MainActivity.h的文件

使用javah生成

三、在当前项目中添加jni文件夹,在文件夹下面添加javah.c文件,并
把com_shi_androidstudy_ndk01_MainActivity.h文件中的函数名称复制粘贴进去
#include <jni.h>

JNIEXPORT jstring JNICALL Java_com_shi_androidstudy_ndk_MainActivity_useJavah
  (JNIEnv * env, jobject obj){
    char* pc = "use javah make .h文件";
    jstring str = (**env).NewStringUTF(env, pc);
    return str;
  }
继续在jin文件中添加Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := javah
LOCAL_SRC_FILES := javah.c

include $(BUILD_SHARED_LIBRARY)
继续在jin文件中添加Application.mk

APP_ABI := all

添加jni文件夹

四、继续在jni文件夹中打开命令行窗口,ndk-build 生成.so文件,修改gradle文件(不修改项目无法找到库文件)
,然后成功运行项目

运行项目

五、更加方便的使用javah

本文主要实现了如何对一个包含native方法的对象生成.h文件,以方便我们使用其中的函数名,上面我们是通过命令行来
生成.h文件,下面我们再介绍一种更加简单的方法,把javah添加的AndroidStudio的Tool中,我们直接右键就能生成
我们想要的.h文件

  • 在设置界面,找到External Tools,如下图,然后点击右边方框的“+”。

设置tool

继续设置相应的参数

设置tool参数


Program: $JDKPath$\bin\javah.exe
Parameters: -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $ModuleFileDir$\src\main\Java

使用我们添加的Tool,成功生成.h文件
设置tool参数

项目地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<QJniObject>是Qt QML中的一个自定义组件,用于在Qt QML中调用Java代码。这个组件需要使用Qt Android Extras模块,因为它是为Android平台开发的。使用<QJniObject>,可以通过JNI(Java Native Interface)调用Java的方法和属性,以便与Java代码进行交互。 该组件提供了以下属性和方法: - className: 要调用的Java类的名称。 - objectName: 给Java对象设置的名称。 - onCreated: 当Java对象创建时调用的信号。 - onDestroyed: 当Java对象销毁时调用的信号。 - callMethod(methodName, returnType, argumentTypes, arguments): 调用Java方法。 - getProperty(propertyName, propertyType): 获取Java属性值。 - setProperty(propertyName, propertyValue): 设置Java属性值。 使用<QJniObject>的步骤如下: 1. 导入Qt Android Extras模块:`import QtAndroidExtras 1.0` 2. 在需要使用Java代码的Qt QML文件中,添加<QJniObject>组件。例如: ``` Item { id: root QJniObject { id: javaObject className: "com.example.MyJavaClass" objectName: "myJavaObject" onCreated: { console.log("Java object created"); } onDestroyed: { console.log("Java object destroyed"); } } Button { text: "Call Java Method" onClicked: { var result = javaObject.callMethod("myJavaMethod", "void", ["int"], [42]); console.log("Java method called with result: ", result); } } } ``` 3. 在Java代码中,创建一个与<QJniObject>组件中指定的className和objectName相同的Java对象。例如: ``` package com.example; public class MyJavaClass { public void myJavaMethod(int value) { System.out.println("myJavaMethod called with value: " + value); } } ``` 注意:使用<QJniObject>时,需要将Java代码打包成一个Android应用程序,并在Qt Creator中使用Android SDK和NDK进行部署和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值