java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园
下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令。
这里以D:\ndk\samples\hello-jni为例,打开D:\ndk\samples\hello-jni\jni\hello-jni.c查看代码:
/** Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*http://www.apache.org/licenses/LICENSE-2.0*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
#include
#include
/*This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java*/
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
因为我们是拿这个c源码文件来使用,如果迁就Java_com_example_hellojni_HelloJni_stringFromJNI
函数名的话,在我们的android工程中java类的声明就要是:com/example/hellojni/HelloJni.java。
反之,如果我们的android工程已经创建好,并且包名是com.example.hellojni,stringFromJNI函数我们写在了MainActivity.java类里,
那么这里的c函数就要修改为:Java_com_example_hellojni_MainActivity_stringFromJNI,否则在寻找函数时会找不到。
然后执行命令:D:\ndk\ndk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup"Compile thumb : hello-jni <= hello-jni.cSharedLibrary : libhello-jni.soInstall : libhello-jni.so => libs/armeabi/libhello-jni.so
编译成功会在D:\ndk\samples\hello-jni\libs\armeabi目录下生成libhello-jni.so文件。
三、创建android应用程序并使用so文件
打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,
在此包下添加一个HelloJni.java,
package com.example.hellojni;
public class HelloJni {
public native String stringFromJNI();
/*This is another native method declaration that is *not*
* implemented by 'hello-jni'. This is simply to show that
* you can declare as many native methods in your Java code
* as you want, their implementation is searched in the
* currently loaded native libraries only the first time
* you call them.
*
* Trying to call this function will result in a
* java.lang.UnsatisfiedLinkError exception !*/
}
MainActivity.java修改为:
package com.example.hellojni;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
HelloJni jni = new HelloJni();
TextView tv = new TextView(this);
String str = jni.stringFromJNI();
Log.d("HelloJni", str);
tv.setText(str);
setContentView(tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu);
return true;
}
static {
System.loadLibrary("hello-jni");
}
}
把编译生成的libhello-jni.so文件复制到F:\eclipse_workspace\HelloJni\libs\armeabi目录下(armeabi如果不存在则手动创建之),然后编译运行,效果图如下:
参考资料:
java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园相关推荐
- 如何在Windows中的命令提示符下删除特定目录中的文件/子文件夹
本文翻译自:How to delete files/subfolders in a specific directory at the command prompt in Windows Say, t ...
- Linux下使用C语言查找一个文件夹下指定扩展名的所有文件
最近在linux下要干点和c语言相关的任务,其中涉及使用C语言查找一个文件夹下指定扩展名的所有文件,我去开始在网上查找后粘贴后不能用,最后发现是windows下才能使用.最后找到了一篇不错的文章,ht ...
- 删除指定文件夹下的小于 4K的所用文件...
删除指定文件夹下的小于 4K的所用文件... (记一次垃圾邮件的删除..) Const ForReading = 1, ForWriting = 2, ForAppending = 8 Const T ...
- PowerShell遍历文件夹下的子文件夹和文件
PowerShell遍历文件夹下的子文件夹和文件是一件很容易的事儿.Get-ChildItem这个cmdlet就有一个recurse参数是用于遍历文件夹的. PowerShell中,使用Get-Chi ...
- 解放文件夹下所有层级的特定格式文件,找出文件夹内所有的txt/FLAC/MP4/MP3等等等等,并复制到另一个文件夹中
解放文件夹下所有层级的特定格式文件,找出文件夹内所有的txt/FLAC/MP4/MP3等等等等,并复制到另一个文件夹中 引言 代码 得意 天天学习,好好向上 引言 各位朋友们好!最近遇到一些想要方便办 ...
- java bat运行jar文件_windows下bat批量运行jar包
1. 在cmd下,java -jar ***.jar 运行后窗口不能关,但如果有多个jar,则会有多个cmd的窗口,很难看 2. 在cmd下,javaw -jar ***.jar运行后窗口可以关,但如 ...
- 在 windows 7 和 MinGW 下编译 OpenOCD 过程
先说一下我的软硬件环境: 硬件: 一块评估板 Atmel SAMD21 xplained pro 没有普通的 Jtag 口, 它提供了 EDBG USB 口, 支持 CMSIS-DAP, OpenO ...
- qt4.8添加mysql驱动_Windows下编译Qt4.8 MySQL数据库驱动
编译MySQL驱动 在Linux下准备移植到Windows下发布使用,遇到的问题: MySQL链接问题,没有相应的驱动 按照官方助手的去编译的话太费时间,编译起码要好几个小时,而且最终效果是一样的 ...
- trinitycore MySQL模块_Windows下编译TrinityCore服务端
第一步建立文件夹 在任意分区根目录建议一个文件夹,但是名称不要用中文,比如我在E盘建立文件夹Trinity. 然后在文件夹Trinity右键选择Git Bash Here 之后出现以下画面 之后输入下 ...
最新文章
- client-go使用实例
- [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- SQL语句获取数据库名、所有表名、所有字段名及字段类型
- leetcode 167 Two Sum II - Input array is sorted
- Log4j 2使用教程二 【详解】
- rbac权限管理5张表_Laravel5实现RBAC权限管理
- 计算机winform参考文献写,毕业论文基于C#WinForm的语音通信系统设计.doc
- react native进一步学习(NavigatorIOS 学习)
- 红旗7.0 rc1 版编辑开始菜单
- Android GSON解析JSON数据
- java开发常用的linux命令,Java开发中最常用的Linux命令整理
- C语言编程练习,猜数字游戏实现
- 注册测绘师考试复习视频资料
- 互联网公司无线接入平台怎么样
- ZZULIOJ1076-1080Python解法
- [河内塔]汉诺塔实现
- 5.Wide Deep Learning for Recommender Systems论文详细解读和代码实现
- SIGGRAPH Asia 2022 | 港中文MMLab:Marker Correspondence估计框架和应用
- matlab智能体运动轨迹,智能车辆运动轨迹规划方法的研究
- 天津大学计算机课程设计挂,天津大学智能装置课程设计 电子时钟..doc
热门文章
- 前端学习(601):集成react插件
- spring mvc学习(52):json数据类型提交
- 第四十九期:大牛总结的MySQL锁优化,写得太好了!
- KEIL ARM 6.12 compiler 编译__ASM 错误的解决方法
- 移动端click延迟和tap事件
- 关于春招 秋招面试的一些经验
- linux 64位 寻址空间_Ubuntu 20.04(64位)如何配置gcc-3.4用于编译linux-0.11
- 信号量与令牌桶_限流的4种方式令牌桶实战
- 学习10:Python重要知识
- sql 查询结果自定义排序