`

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



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

 

分享到:
评论

相关推荐

    android 使用jni调用c++

    android配置ndk,使用swig编译生成jni Java接口调用c++方法。这是成功的例子,前提是你要配置一下你的环境变量。如有疑问,可以去查看我的博客。有相关内容。

    JNI文档资料源码_2020_01_22

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

    windows下 eclipse+ndk编译及使用jni示例

    由于没有找到生成.cproject的工具,只能手写,所以本文不使用该方法,以后找到了好的方法再补充。委屈 6.) 在dos窗口中,cd到项目路径下,运行ndk-build 命令,该命令会自动搜索该路径子目录下的native项目,进行...

    JNI中C代码调用使用java属性和方法

    从事NDK必经之路,根据文档快速入手,体验c代码如何调用java方法,和修改java类属性值;

    Android NDK中将图像列表返回给Java调用层处理方法

    在Android开发图像处理APP中,经常会将Bitmap传到JNI中,使用OpenCV等工具处理后直接将Bitmap返回到Java调用层作输出显示,因此该源码提供了解决方案。 参考地址:...

    JNI完全技术手册 带完整书签

    Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55 1、实例一:在jni中调用标准c中自带的函数printf(): 57 2、实例二、调用c 语言用户定义的函数... 58 ...

    jnidemo调用

    该资源包含了使用最新的Android studio实现jni ndk编程,使用CMakeLists.txt配置生成多个so文件,java调用本地方法,本地方法,调用java中的方法,以及jnionload的简单实例,喜欢的下载,具体可以查看 ...

    Android NDK生成及连接静态库与动态库的方法

    但是在某些情况下,我们需要借助C/C++来写JNI本地代码。比如,在使用跨平台的第三方库的时候;为了提升密集计算性能的时候(这种情况下往往还可能会直接使用汇编语言)。因此,这里我将为大家介绍如何给其它开发者...

    c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法

    错误为: Android.mk文件 c++的调用方法为: 代码如下:...c中的调用方法: 代码如下:LOCAL_SRC_FILES := com_ndk_test_JniClient.c 另一个使用变量的方法,一直成功运行 c++正确的mk文件: 代码如下:LOCAL_PATH := $

    JNI文档资料源码_2020_02_14_3

    【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104322381 I...

    JNI文档资料源码_2020_02_14_2

    【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 ) 博客地址 : ...

    pro_android_cpp_with_the_ndk.pdf

    1.3.1 检查GNUC库版本 1.3.2 激活在64位系统上支持32位的功能 1.3.3 在Linux平台上下载并安装Java开发工具包(JDK) 1.3.4 在Linux平台上下载并安装ApacheANT 1.3.5 在Linux平台上下载并安装GNUMake 1.3.6 在Linux...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

    Android中实现开机自动启动服务(service)实例

    最近在将 HevSocks5Client 移植到 Android 上了,在经过增加...Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pthread_create 创建个线程跑原来的 main 就行啦。 代码如下:…#if defined

    NDKTutorial:NDK示例

    NDK-tutorialTutorial-1使用JNI新建Java对象Tutorial-2使用JNI调用Java方法Tutorial-3在JNI中创建异步线程Tutorial-4使用JNI读写文件Tutorial-5使用JNI进行Socket通讯Tutorial-6使用JNI对Bitmap进行灰度处理

    2010年谢彦的android笔记

    3.3 Java对C库的调用 70 3.3.1 android中使用JNI 70 3.3.2 安装使用NDK 72 3.3.3 在源码中将库打进apk 73 3.3.4 简单的C库调试方法 75 3.4 典型应用 76 3.4.1 语音合成 76 3.4.2 语音识别简介 79 3.4.3 语音识别方法...

    FLameUtilsAndso.zip

    使用java编写的一个帮助类调用lame编译后的.so文件,需要注意以下两点 1. 调用本地方法的类名与报名是否与.so文件中定义的一致 参考: https://blog.csdn.net/ouyang_peng/article/details/52997698 2. 是否设置了...

    java前端源码下载-opencv_native_androidstudio:一个带有原生Opencv的androidstudio项目

    java前端源码下载带有 Android Studio 的原生 OpenCV 此应用程序是一个带有原生 OpenCV 的示例 Android Studio 项目。 它获取相机帧,使用其灰色矩阵引用作为参数进行 JNI 调用,从 C++ 方法向图像添加一些随机噪声...

    android笔记.rar

    3.3 Java对C库的调用 ... ...70 3.3.1 android中使用JNI... ..70 3.3.2 安装使用NDK ... .72 3.3.3 在源码中将库打进apk ... ...73 3.3.4 简单的C库调试方法 ... ...75 3.4 典型应用... ..76 3.4.1 语音合成... .76 ...

    自己平时做的android相关的总结

    Ndk的使用方法: Ant 与 android update project 命令行只有在非根盘符上才能运行 android Launcher Android 运行环境搭建 Android:name什么时候加”.” Activity class {package/class} does not exist 问题的解决 ...

Global site tag (gtag.js) - Google Analytics