ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JNI调用C语言

2021-09-25 13:05:30  阅读:149  来源: 互联网

标签:调用 Java C语言 cpp testc1 endif Test JNI native


一、Java调C

  1. 编写Native方法。
  2. 使用javah命令生成.h头文件。
  3. 复制.h头文件到CPP工程中。
  4. 复制jni_md.h和jni.h到CPP工程中。
  5. 实现.h头文件中生成的。
  6. 生成dll文件。

C的函数名称:Java_包名_方法名称。

1、java:Test

public class Test {
    public static void main(String[] args) {
        System.out.println(Test.class.getName());
    }

    public static native  void getStringFormC();
}

2、javah:Test.h

javah Test

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

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    getStringFormC
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Test_getStringFormC
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

3、c实现:Test.cpp

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

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    getStringFormC
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_Test_getStringFormC(JNIEnv* env, jclass) {
  //将C的字符串转为JAVA的字符串
  return env -> NewStringUTF("C string");
}

#ifdef __cplusplus
}
#endif
#endif

二、Android JNI

1、Android Studio创建C++项目

2、app/src/main/cpp/CMakeLists.txt: 

# 版本号
cmake_minimum_required(VERSION 3.10.2)

# 项目名称,没有实际意义,可以选填
project("testc1")

# 添加写的cpp项目注意需要在追加在最后面,有先后顺序的
add_library(
		# 参数1:依赖库的名称,仅此一个,在System.loadLibrary("testc1")使用
        testc1

        # 参数2:
        SHARED

        # 参数3:生成的或者自己写的cpp需要加在后面,不能插入到前两个参数中
        native-lib.cpp)


find_library( 
        log-lib

        log)

target_link_libraries( 
        testc1
)

3、app/src/main/cpp/native-lib.cpp

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_simple_testc1_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {
	// 将C的字符串转为JAVA的字符串
    char* hello = "Hello from C++666";
    return env->NewStringUTF(hello);
}

4、app/src/main/java/com/simple/testc1/MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Example of a call to a native method
        binding.sampleText.text = stringFromJNI()
    }

    /**
     * A native method that is implemented by the 'testc1' native library,
     * which is packaged with this application.
     */
    private external fun stringFromJNI(): String

    companion object {
        // Used to load the 'testc1' library on application startup.
        init {
            System.loadLibrary("testc1")
        }
    }
}

效果图:

 

标签:调用,Java,C语言,cpp,testc1,endif,Test,JNI,native
来源: https://blog.csdn.net/yoonerloop/article/details/120470270

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有