`

java调用c库,jni的用法,ndk

 
阅读更多

之所以标题写这么长是希望有需求的朋友能搜索到。
长话短说,java为了调用c库,需要用到JNI(JAVA本地调用)。见百度百科的介绍:
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

那么如何使用它呢?我摸索了一天,头都疼了,也没搞定,下班迅速撤离公司,到家不甘心再打开笔记本,按照介绍的慢慢来,再找找针对错误提示的回答,居然解决了,所以整理好了供大家使用。mac os下,按照我的方法肯定能成功,linux的话,是很相近的,windows请再补充一点如何布置ndk的知识给自己。

第一步:布置ndk,到http://developer.android.com/tools/sdk/ndk/index.html下载对应操作系统的ndk包,下载后解压缩,建议放在跟android skd或javasdk相同的路径下,当然放在什么位置都无所谓。

第二步:布置环境变量
export NDK_HOME=/Users/dhn/devellop/android-ndk-r8b
export PATH=${PATH}:${NDK_HOME}
注意上述两行只是为了将ndk路径给PATH,NDK_HOME只是为了增强可读性。
将上面两行写入~/.bash_profile或/etc/profile,然后source ~/.bash_profile或source /etc/profile或者你重启shell终端,你懂的。

至此,ndk就算布置好了,可以使用了。那么如何使用呢?

我们新建一个android项目,然后创建一个文件HelloWorld.java,内容如下:

package com.example.androidtest;

public class HelloWorld {
	public native long displayHelloWorld();
	static { 
		System.loadLibrary("jnitest");
	}
}



在项目入口文件中布置如下内容:

package com.example.androidtest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;

public class MainActivity extends Activity {
	private HelloWorld jt;
	private TextView viewHello;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jt = new HelloWorld();
        long jtl = jt.displayHelloWorld();
        this.viewHello = (TextView) super.findViewById(R.id.hello);
        this.viewHello.setText(""+jtl);
    }
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}



注意布置相应的activity_main.xml。
然后在shell中进入到项目目录中的src/com/example/androidtest目录,也就是源码位置,执行javac HelloWorld.java,生成HelloWorld.class文件,注意这一步是编译java文件。
然后退回到src目录下,注意这一步很关键,必须退回到src下,也就是项目名的外面。
执行:javah com.example.androidtest.HelloWorld,即项目名.类名。
这时候在src下面会生成头文件:com_example_androidtest_HelloWorld.h
将这个头文件移动到项目中的jni目录(这个目录要先手动创建)下。
然后编写一个xxx.c,这里名字可以随便取,实现里面的函数。
内容如下:

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

JNIEXPORT jlong JNICALL Java_com_example_androidtest_HelloWorld_displayHelloWorld(JNIEnv*  env, jobject thiz) {
	return 100;
}



写好后在jni目录中写一个Android.mk文件,内容如下:

引用

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jnitest
LOCAL_SRC_FILES := jnitest.c

include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)



注意第一行是LOCAL_MODULE,不要写错了。
然后退回到项目根目录中,即jni目录中执行cd ../,就是jni或src的上层目录。

执行ndk-build即可看到如下信息:

引用

Compile thumb  : jnitest <= jnitest.c
SharedLibrary  : libjnitest.so
Install        : libjnitest.so => libs/armeabi/libjnitest.so



然后运行你的程序吧,你能看到启动程序后界面能显示你的返回值,就代表你成功了!

 

分享到:
评论

相关推荐

    JNI,java调用c Demo

    在这个"JNI,java调用c Demo"中,我们将探讨如何设置和使用JNI来让Java程序调用C代码。 首先,我们需要理解JNI的工作原理。JNI提供了一种接口,使得Java虚拟机(JVM)能够调用本地(native)代码,也就是非Java的...

    android jni和NDK简单案例(.so库调用)

    6. **在Java代码中调用JNI**:在Java类中声明native方法,并使用`System.loadLibrary()`加载对应的.so库,然后就可以直接调用这些本地方法了。 7. **运行与测试**:由于案例中提到只在x86兼容的模拟器上测试,这...

    jni使用ndk-build的方式调用

    在Java代码中,通过`System.loadLibrary("Testndkbuild")`加载刚才编译生成的动态库,然后通过`native`关键字声明对应的本地方法,使用`javah`工具自动生成对应的头文件,最后实现这些方法。 5. **构建本地库**: ...

    android JNI C 调用Java

    Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码调用C/C++原生代码,同时也允许C/C++代码调用Java的方法。JNI在开发高性能、低级硬件交互、使用现有C库或者优化性能的关键部分时...

    JNI NDK 开发指南

    1. 性能优化:对于计算密集型或图形密集型的任务,如游戏引擎、图像处理等,使用JNI和NDK可以调用本地库,减少虚拟机的解释执行,提高运行效率。 2. 调用系统级API:有些Android系统级别的功能,如硬件加速、多线程...

    NDK编译 JAVA JNI 原生调用

    它包含了一系列的头文件和库,使得Java代码能够通过JNI接口调用C/C++代码,同时也提供了交叉编译器,将C/C++源码编译为适用于不同Android架构的机器码。 2. JNI原理: JNI接口定义了一套标准的C/C++函数,这些函数...

    jni C调用java示例

    使用NDK编译工具链,我们可以在该文件中编写C代码来实现Java的本地方法。例如: ```c++ #include &lt;jni.h&gt; #include extern "C" JNIEXPORT jstring JNICALL Java_com_example_ndkdemo3_MainActivity_stringFromJNI...

    AIDL和JNI使用的小例子

    在Android开发中,JNI常用于优化性能关键的部分,例如处理大量计算任务、调用硬件特性或者使用C/C++库。 在本示例中,你可能有一个名为`testndk`的目录,这通常包含了与JNI相关的源代码。在JNI中,你需要创建一个`...

    android NDK(java调用C)

    本文将深入探讨如何在Android应用中通过Java调用C语言的函数。 首先,我们需要了解NDK的基本概念。NDK提供了一种方法,使得Java应用能够通过JNI(Java Native Interface)调用本地库(C/C++代码)。JNI是Java平台的...

    Android Studio JNI/NDK 编程

    JNI(Java Native Interface)是Java平台的一部分,提供了一个框架,使得Java代码可以调用本地(非Java)代码,而NDK(Native Development Kit)是Google提供的工具集,用于在Android平台上编译和调试C/C++代码。...

    jni中用多线程调用java代码

    6. **加载JNI库**:在Java代码中,使用`System.loadLibrary`加载编译好的JNI库,并调用之前声明的native方法。 7. **测试和调试**:导入项目到Eclipse,运行并调试,确保所有线程都能正确地调用Java方法,并且没有...

    jni、ndk绝命讲解

    NDK(Native Development Kit)则是Android开发中的一个工具集,用于在Android应用中使用C/C++代码,通常与JNI一起使用。这篇“jni、ndk绝命讲解”很可能是对这两个关键概念深入且全面的解析。 JNI是Java平台的标准...

    Android使用JNI调用Python so解释器

    5. **注册JNI方法**:在Java的`native`方法上使用`@Override`注解,并在对应的C/C++头文件中声明这些方法。在`Android.mk`或`CMakeLists.txt`文件中,指定编译的源代码和链接的库。 6. **加载Python脚本**:在Java...

    visual studio 2019下C++通过JNI调用JAVA代码

    JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用与C/C++库无缝结合。 首先,我们需要确保已经安装了以下组件: 1. Visual Studio 2019:这是我们的开发环境,支持...

    jni之ndk hello world

    2. **创建JNI文件**:在Java源码中,你需要创建一个本地方法声明,比如`native void sayHello()`,并使用`System.loadLibrary("native-lib")`加载对应的本地库。 3. **生成头文件**:使用`javah`命令或者Android ...

    NDK_C调用java demo

    **NDK_C调用Java Demo详解*...在"NDK_C调用Java demo"中,我们学习了如何定义Java方法,创建JNI头文件,实现C代码,并配置构建系统来编译和链接这些组件。理解并掌握这一技术对于提升Android应用的性能和功能至关重要。

    Android通过JNI调用.so动态库

    在编译完成后,我们可以在 Android 项目中使用 JNI 来调用.so 动态库中的 C/C++ 方法。 通过 JNI,我们可以在 Android 项目中调用.so 动态库中的 C/C++ 方法,实现与 native 代码的交互。这可以帮助我们实现更加...

    Hello-jni-ndk

    - **Java调用C/C++**:通过`System.loadLibrary("library_name")`加载本地库,然后通过`native`方法调用C/C++实现。 - **C/C++调用Java**:使用`JNIEnv`指针,通过`FindClass`, `GetMethodID`, `CallVoidMethod`等...

    Android-JNI完整工程,实现c++调用java和java调用c++

    - JNI接口提供了Java虚拟机(JVM)和本地代码之间的桥梁,使得开发者可以使用Java调用C/C++函数,反之亦然。 - JNI头文件(`jni.h`)包含了定义了JNI函数和数据类型的声明,是编写JNI代码的基础。 2. **创建JNI...

    C语言调用java语言方法

    "C语言调用java语言方法"是一个典型的跨语言通信场景,主要应用于Android平台上的JNI(Java Native Interface)开发。JNI允许Java代码和其他语言(如C/C++)进行无缝交互,提升性能或者利用已有的库资源。 首先,...

Global site tag (gtag.js) - Google Analytics