求助将jni so打包到jar中加载so库的问题

android项目中如何加载已有so库_百度知道
android项目中如何加载已有so库
1,在项目根目录下建立文件夹libs/armeabi文件夹
2,将so库放入libs/armeabi文件夹注意事项:
1,如果采用静态注册的方式请注意C文件中严格按照命名规则Java_packageName_className_method()的方式命名
2,在Android项目中建立同上述命名规则中packageName中相同的包名,在此包名下建立同上述命名规则中className相同的类名
3,在className声明native方法
4,程序中加载so库System.loadLibrary(data/data/xxx.xxx.xxx/lib/xx.so)或者System.loadLibrary(xx),例如:System.loadLibrary(data/data/com.dtBank.app.service/lib/libjnixcld.so);
其他类似问题
为您推荐:
您可能关注的推广
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Android开发之JNI调用本地C库专题(一):JNI的使用
JNI,是用于开发本地C函数库的技术。用于链接JAVA和C或者C++语言的桥梁。在部分android项目开发中,我们是需要用到这项技术的。在升级APP的时候,我们有时间需要用到增量更新技术,这个也是基于JNI技术实现的,详情请点击:基于JNI技术实现增量更新
那么废话不多说,进入正题。
开发JNI,需要用到NDK,这个大家应该都知道了。还需要一个linux的开发环境。一般而言,可以使用虚拟机装一个ubantu,博主以前就是搞linux开发的,这点还是比较熟悉。但是对于大部分android开发者而言,弄一个虚拟机成本太高。那么,我们需要搭建一个模拟linux的开发环境。这个博主就不说了,直接上链接
NDK环境搭建
以上博文其实只需要做完第三步即可,如果是下载安装谷歌官方集成的eclipse,第三步都可以不用做了。
好,当一切东西都准备好了之后,我们以一个例子来讲解如何开发一个JNI项目。
一、新建一个Android项目
这个正常使用,就是新建一个Android项目
二、C语言方法实现。
1、新建本地native方法
一般而言,需要用C语言实现的方法,我们需要用native关键字去修饰,这些方法可以放在任何一个类中,博主为方便,就都放入一个类中去。参考代码:
public class DataProvider {
public native int add(int x, int y); //
public native String sayHelloInC(String s);
public native int[] intMethod(int[] iNum);
2、编译native方法
这里需要用C语言去实现三个方法,一般而言,我们用到JNI技术,都是用做加密。所以,上述三个方法应该是常用的方法。这个使用,我们需要将这个类用javah去编译生成C代码的头文件。首先,我们得在CMD窗口中进入到android项目中的src文件夹中(如果是JDK1.6,则需要进入到/bin/classes目录中,博主的是JDK1.7,所以进入的是src目录),如图所示
然后执行 javah&com.example.ndkpassdata.DataProvider(这里需要用到全路径全类名)
然后我们刷新一下项目,会发现在src目录下生成了一个.h头文件,如图所示:
3、创建JNI目录
在工程中新建一个名字为jni的文件夹,名字千万不要弄错,如图:
将刚刚的头文件,copy到该文件夹下,然后新建一个名字一样的.c文件。点开 头文件后,我们发现刚刚写的三个方法都已经生成,如图所示:
4、编写.c文件
这个时候,我们需要在新建的.c文件中,写入这三个方法。.c文件如何写,相信会C语言的同学应该都明白,关于c代码中如何转换java传入过来的参数和调用java中的方法,可以参考jni.h的头文件,里面有详细接口调用方法。这里博主就不在描述,直接上所有的代码,有详细注释:
#include &stdio.h&
#include &com_example_ndkpassdata_DataProvider.h&
#include &android/log.h&
#include &string.h&
#define LOG_TAG &clog&
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
//将java语言中的字符串格式转换为C语言中的字符串格式。
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = (*env)-&FindClass(env, &java/lang/String&);
jstring strencode = (*env)-&NewStringUTF(env, &GB2312&);
jmethodID mid = (*env)-&GetMethodID(env, clsstring, &getBytes&,
&(Ljava/lang/S)[B&);
jbyteArray barr = (jbyteArray)(*env)-&CallObjectMethod(env, jstr, mid,
strencode); // String .getByte(&GB2312&);
jsize alen = (*env)-&GetArrayLength(env, barr);
jbyte* ba = (*env)-&GetByteArrayElements(env, barr, JNI_FALSE);
if (alen & 0) {
rtn = (char*) malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
(*env)-&ReleaseByteArrayElements(env, barr, ba, 0);
JNIEXPORT jint JNICALL Java_com_example_ndkpassdata_DataProvider_add(
JNIEnv * env, jobject jobject, jint x, jint y) {
// 想在logcat控制台上 打印日志
LOGD(&x=%d&, x);
LOGI(&y=%d&, y);
// log.i(TAG,&sss&);
return x +
JNIEXPORT jstring JNICALL Java_com_example_ndkpassdata_DataProvider_sayHelloInC(
JNIEnv * env, jobject jobject, jstring str) {
char* c = &hello&;
// 在C语言中不能直接操作java中的字符串
// 把java中的字符串转换成c语言中 char数组
char* cstr = Jstring2CStr(env, str);
strcat(cstr, c);
LOGD(&%s&, cstr);
return (*env)-&NewStringUTF(env, cstr);
JNIEXPORT jintArray JNICALL Java_com_example_ndkpassdata_DataProvider_intMethod(
JNIEnv * env, jobject jobject, jintArray jarray) {
(*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
// 数组的长度
(*GetArrayLength)(JNIEnv*, jarray);
// 对数组中每个元素 +5
int length = (*env)-&GetArrayLength(env, jarray);
//拿到指针初始位置
int* array = (*env)-&GetIntArrayElements(env, jarray, 0);
int i = 0;
for (; i & i++) {
*(array + i) += 5;
5、编写android.mk文件
该文件的写法请到ndk目录下的docs目录,打开ANDROID-MK.html,里面有使用方法说。这里博主就说说一般必须写的。
LOCAL_PATH := $(call my-dir) & // 返回当前c代码目录
include $(CLEAR_VARS) & & & &// 清楚了所有 已local 开头的配置文件 唯独不清楚LOCAL_PATH
LOCAL_MODULE & &:= hello & // 库函数的名字 &严格遵守makefile 格式 &lib &.so &如果前面加lib 不会自动生成了
&LOCAL_SRC_FILES := Hello.c &//源文件名称,就是刚刚新建的那个.c文件的名称。
include $(BUILD_SHARED_LIBRARY) &// 加入库函数
由于在之前的代码中使用了C语言的日志函数log,所以在.mk文件中需要加入库引用的声明,代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
:= libhello
LOCAL_SRC_FILES := Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
6、编译C文件 当android文件写好之后,一切的准备工作都已经就绪,这个时候我们只需要调用NDK去编译该项目即可上次.so动态库文件。这个时候需要启动Cygwin,然后来到该项目的目录下,调用ndk-build命令即可。过程如图所示:
当编译完成之后我们刷新项目,会发现多出了一个obj文件夹,在libs文件夹中也会多出一个armeabs文件夹,在这里面就有我们刚刚编译生成的库。
三、C语言函数库方法调用
那么编译好之后,我们需要调用刚刚的方法,这个时候就简单了。在调用的地方,需要加入一个静态代码块,利用System.loadLibrary(&hello&);方法将刚刚生产的库文件导入。详细看代码:
public class MainActivity extends Activity {
System.loadLibrary(&hello&);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
provider = new DataProvider();
public void click1(View view) {
int result = provider.add(6, 8);
System.out.println(result);
public void click2(View view) {
String str = provider.sayHelloInC(&freedom&);
Toast.makeText(getApplicationContext(), str, 0).show();
public void click3(View view) {
int[] arr = new int[] { 5, 6, 7, 8, 9 };
provider.intMethod(arr);
for (int i : arr) {
System.out.println(i);
好了,至此利用JNI开发本地native方法的流程已经讲解完毕,需要值得注意的是,如果本地.c文件有变更,我们需要调用ndk-build去重新编译.c文件,这个时候最好将本地缓存目录obj文件夹删除掉。希望能帮助到看到此文的人。
android开发源码分析--多个activity调用多个jni库的方法
android开发源码分析--多个activity调用多个jni库的方法 有时候,我们在开发android项目时会遇到需要调用多个native c/jni库文件,以下是本人曾经实现过的方法,如果有知道其他方法,还望不吝指教。 例如,在 android 工程里有两个 activity ,分别是 act
编写android程序调用jni本地方法的实现(详细例子)
在写android程序的时候会用到jni,接下来的代码讲诉C实现,环境配置请看我其他的博客,不多说,直接上代码,代码上几乎每一句都会解释,绝对易懂
#include &com_ndk_test_JniClient.h& #include &stdlib.h& //#include&jni.h&gt
Android初识JNI-搭建NDK开发环境
在使用Jni之前,我们先了解一下: 1:什么是JNI 2:为什么要用JNI, 3:JNI的相关配置。 4:在android中使用JNI 那么问题来了: JNI:从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C
Android JNI专题交流
《Android JNI 专题&共分为四期:
Jni简单demo Jni基本数据类型和方法介绍 Jni解析java自定义数据类型和回调java方法 Jni performance提高和Exception规避
已经整理成CHM和PDF文档,欢迎大家下载参阅: CHM:http://download.csdn.net/detail/cofftech/7
android中使用jni可以调用linux操作系统下的库吗 比如我想通过jni调用c++库实现网络收发,那我是不是可以先在ubuntu操作系统里做好.so文件(调用诸如sys/socket.h之类的头文件和pthread.so之类的系统库),再把.so文件用在android项目中?
------解决方案--------------------
Quote: 引用:
Android---简单的JNI实例 一、JNI概述
JNI 是Java Native Interface的缩写,中文翻译为“Java本地调用”,JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。就是说,JNI是一种技术,通过这种技术可以做到两点:
1)Java程序中的函数可以
Android系统JNI的实现方式
Android系统JNI的实现方式 Allrightsreserved
JNI(JavaNativeInterface)定义了一种Java代码调用C或者C++代码等其他代码的方式。 在Android系统中,
android JNI 简单demo(2)之JNI demo 编写
android JNI 简单demo(2)之JNI demo 编写
一、搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/ 二、JNI 基本要素: 1、编写 含native 方法的java文件。 2、把该文件用javah 生成 Cygw
android jni 相关知识
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
新人关于Andriod 调用本地方法jni求助,望懂得的大神解答 新人刚接触androidjni不久,近日在用jni调用的本地dll库中含有GetModuleFileName函数,该函数在vc等平台中是获得当前运行程序路径,而在jni的dll中调用后无法获取android运行的路径,求解有什么替代的方法吗,还是说GetModuleFileName参数设置有技巧,望各位大神解答,拜谢!
JNI(2) Android NDK 环境搭建与使用
NDK主要通过Java的Jni与C/C++交互,不会Jni的可先去看看我之前整理的&& JNI(1) Java与C/C++的交互 &&
一。搭建NDK开发环境
android jni 开发笔记
我之前是零零散散的接触过一点android上的JNI的东西的。于是我下意识的认为这个东西也没啥。 但是实际上还真不是这样。下面是我在做JNI开发中遇到的一些曾经令我苦恼的问题:
JNI的开发步骤: 第一步
在java文件中声明函数定义
利用javah工具将java
android中JNI的调用生成头文件步骤
android 中通过JNI调用本地方法步骤介绍:首先是在eclipse中生成类文件
package P public class JNI { static{ System.loadLibrary(&hello&); } public native void printHello(); public static void
Android 4.4.2 动态添加JNI库方法记录 (一 JNI库层)
欢迎转载,务必注明出处。http://blog.csdn.net/wang_shuai_ww/article/details/ 本篇是继《s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录》之后的另外一种添加JNI和服务的方法。 前面的方法是直接把HAL和服务层添加到
请教JNI调用的C程序常驻内存方法 请教各位大牛,我需要写一个C程序,androidjava通过JNI来调用,C程序读取SD卡上一个几十兆的加密数据文件,解密后存放到数组,根据调用参数进行查询和计算,并向java返回计算结果。
一个读取、解密、加载的过程大概需要花费好几秒钟,我希望java主程序能每秒进行一次JNI调用并显示结果。不知道有没有方法,在C程序被调用退出后,不销毁这个数组
android下jni开发总结
对于开发Android来说jni是一个相对应用得比较少的玩意(相对于Android系统来说),正好最近这一阵子公司的项目比较轻松有一定的空闲时间,就利用起来整理了一下android下jni开发常用到的知识点和一些比较重要的用法,发话不多说直接进入主题。
在这里,对于jni的一些基本的介绍我就不多说了感兴
Android4.2.2NDK和源码开发jni的异同
C/C++开发,在NDK和源码中输出Log信息的方法!
NDK: 1、包含头文件 #include &android/log.h& 2、Android.mk中包含库 LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog 上面这个一定要,不然出现error: undefined reference
QtAndroid详解(5):JNI调用Android系统功能(2)
在“QtAndroid详解(4):JNI调用Android系统功能(1)”中我们给出了一些简单的示例,演示了如何使用 Qt JNI 类库访问网络状态、系统资源目录、当前应用信息等等,这次呢,我们提供一些新的示例,这些示例可能更具实际意义。本文的示例包括:
震动 让屏幕常亮 动态改变应用的显示方向
Android中关于JNI 的学习(五)在C文件中使用LogCat
Log是开发过程中,对于我们调试程序非常重要的一个工具,有很多时候,我们正是通过Log才能够看清楚程序是不是真的按照我们想像中的模式在跑,从而定位到问题所在的地方。而在Android开发中,毫无疑问,要是没有了logcat,我们调试程序的时候,就会痛苦死。 在NDK的开发中,尽管我们是利用C/C++来开发程序的,然后通过加载共享
Android中关于JNI 的学习(二)对于JNI方法名,数据类型和方法签名的一些认识
我们知道,利用javah生成的c/c++头文件的时候,会对java中定义的 native 函数生成对应的jni层函数,如下:
/* * Class: com_lms_jni_JniTest * Method: getTestString * Signature: ()Ljava/lang/S *
Android中关于JNI 的学习(一)对于JNIEnv的一些认识
一个简单的例子让我们初步地了解JNI的作用,但是关于JNI中的一些概念还是需要了解清楚,才能够更好的去利用它来实现我们想要做的事情。 那么C++和Java之间的是如何通过JNI来进行互相调用的呢? 我们知道,在Android中,当Java文件被编译成dex文件之后,会由类加载器加载到Dalvik VM(DVM)中,由DVM来进行
Android4.2.2NDK和源码开发jni的异同(2)
NDK开发Android.mk编写samples
1、 jni中包含多个源文件,且多个文件编译成为不同的so文件 (1)jni/Android.mk: include $(call all-subdir-makefiles)
(包含所有子目录下Android.mk) 注意:在写Android.mk文件时, c
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!! RT,安卓在调用底层JNI的C代码的时候出现的问题,反复的调用久了就会出现这样的问题,但是我看C代码又看不出来什么问题,报了这样错误以后,用C写的代码还有打印信息,都不好定位错误在哪一行,参考这位高人的文章http://zzhhui./266543
Android jni系统变量、函数、接口定义汇总
在做Android jni开发时,jni为我们提供了哪些函数、接口、变量,有时候一头雾水,今天就把jni.h中定义的所有内容列出来,供自己查阅:
/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Ve
Android-JNI搭建以及调用
转载请注明出处,谢谢~ 首先要新建一个工程,起名HelloJni。然后在工程目录下新建文件夹jni。如图: 我用的是eclipse
然后我们用快捷键Alt+Enter进入工程属性选项,选择左边栏的builder,然后点击new:
之后我们选择program,然后会有一个弹出窗口:
在main选项中设置好两个路径,第一个是ndk里ndk-build.
Android中关于JNI 的学习(三)在JNI层访问Java端对象
前面两篇文章简单介绍了JNI层跟Java层的一些对应关系,包括方法名,数据类型和方法名称等,相信在理论层面,能够很好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,由于表达能力或者理解还是有限,有些地方讲得不是很清楚,如果各位朋友有觉得云里雾里,欢迎大家留言一起学习。 概念上的理解
已有的C源代码如何通过JNI调用 江湖救急!!!看了很多关于JNI的用法,感觉里面调用的c代码写的函数都是符合一定命名规范的,而且是先有了java中的native方法,再去生成接口,再去用C实现。我现在的问题是,已经有了.h文件(其中包括一些结构体的定义,还有一些方法的声明等等)和.c文件(里面是对.h文件中一些方法的实现),很显然这里说的.c文件中的函数肯定没有按照那种JNI的规范来命名。我该怎
将MATLAB代码打包到dll中,android通过jni在native c中调用这个dll,这样实现android调用maltab,可行么 如题,最近想试试把MATLAB中的代码调到android中,貌似通过jar包的方式在android中无法识别MATLAB的东西,就想到通过jni才c中去调用matlab,想问问大牛,不知道这样可行不
------解决思路------------------
Jni开发里一定需要头文件吗? 我查了网上大部分的资料,jni部分都提到要根据类来生成头文件。但是我下载的ndk9给的hellojni例子里,它的hello-jni.c没有头文件,就一个c文件,完成了全部功能,是现在的ndk9不再需要头文件吗?
------解决方案-------------------- 可以不用头文件。直接在C文件里面写代码。
JNI生成的头
【Tech-Android-Jni】Jni中基本方法(2)
Jni中各种特殊的方法。
1). 加载虚拟机:
函数:jint JNI_CreateJavaVM(JavaVM **pvm, void **penv, void args);
参数说明:JavaVM **pvm JAVA虚拟机指针,第二个参数JNIEnv *env是贯穿整个调用过程的一个参数,因为后面的所有函数都需要这个参数,需
Android中关于JNI 的学习(六)JNI中注册方法的实现
在前面的例子中,我们会发现,当在Java类中定义一个方法的时候,如下:
public class ParamTransferTest { public static int testval = 1; public native void changeTestVal();
则在对应的JNI层中,由javah生成的头文件和其对应的C
哪位大侠能提供一个jni访问sqlite数据库的例子? 哪位大侠能提供一个jni访问sqlite数据库的例子?
------解决方案-------------------- 访问SQLite不是很方便吗?为什么要用jni?
------解决方案-------------------- 晕我还没用过jni呢汗颜啊
------解决方案
Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动
中我们已经编译好了硬件抽象层模块,下面就要开始为HAL层编写JNI方法,为上层提供服务。 cd到frameworks/base/services/jni目录中,
android如何使用自定义JNI接口,以及NDK工具的环境搭建与使用。
一、环境的搭建:
1、需要的工具:
(在windows下使用LINUX系统)
android---NDK开发helloworld(jni)
1)打开Android开发者的官网/找到Develop点击。
2)进入后再点击Tools
3)进入后在左侧找到NDK点击,可以见到各种平台的NDKr10,选择需要的下载。
5)解压下载的android-ndk32-r10-windows-x86_64.zip,将其
Android逆向之动态调试so库JNI_Onload函数-----基于IDA实现
之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用。对吾爱破解论坛的该贴,我也是看了很多遍,自己也查了不少资料,但是自己动手的时候总觉比较繁琐,并且很多细节的地方没有注意到,按
Android的jni层如何加载bmp位图 最近在做关于opengles的jni开发的东西,遇见一些问题,以前在java层加载位图然后贴图很容易,当时把相应代码移植到jni层之后,其他的都没问题,但是位图加载遇见了问题,有没有大神指导怎么才能在jni层将bmp图加载到代码中,然后去贴图??
我实在ubuntu环境下开发的
------解决思路----------------------
用JNI时哪些部分代码用C语言来写? 小白新手求助!!
最近在看JNI的相关内容,平常所说的JNI作用也都了解了。
但是有一个疑惑就是,
在编程过程中哪些部分代码用C语言来写?
是只有计算部分用C语言来写,然后返还到JAVA中;
还是说所有的比如按钮的监听、TextView的附值等等;
换句话说,JNI可以将全部的JAVA程序用C语言来写吗,然后在JAVA中只是依据调用就可以?
Android JNI 获取应用签名
使用Android JNI 获取应用签名。 根据获取的签名来生成自己的密码,这样可以防止别人反编译自己的源码后查找密码。
jstring Java_com_masonsdk_jni_JNIUtil_getPWD(JNIEnv* env, jobject thizz ,jobject thiz ){ jclass native_clazz = env-&gt
首先下载ICTCLAS2011_Linux_32_jni,解压后是ICTCLAS50_Linux_RHAS_32_JNI文件夹。 在Eclipse里面新建一个Java Project,把ICTCLAS50_Linux_RHAS_32_JNI/API下的ICTCLAS放到Java Project的src目录下,把ICTCLAS50_Linux_RHAS_32_JNI/API下的其他所有内第三方登录
Java JNI 调用 so 动态链接库
实现一个最简单的 JNI 调用 编写 Java 代码 package sf.
public class Hello{
public native static int add(int x,int y); //java 代码中声明 native 方法
System.load(&/home/lance/main.so&); //以绝对路径加载so文件 }
public static void main(String[] args){
System.out.println(add(1,1));
编译 java 代码 javac -d . Hello.java
命令解释: -d:表示生成目录,生成的目录以package的定义为准; .:表示在当前所在文件夹中生成
查看生成的文件和目录 ls -al
编写C代码 首先生成 .h 头文件
javah sf.gg.Hello
查看生成的 sf_gg_Hello.h 文件
vim sf_gg_Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include &jni.h&
/* Header for class sf_gg_Hello */
#ifndef _Included_sf_gg_Hello
#define _Included_sf_gg_Hello
#ifdef __cplusplus
extern &C& {
sf_gg_Hello
* Signature: (II)I
JNIEXPORT jint JNICALL Java_sf_gg_Hello_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
编写实现 add 方法的 C 代码
vim hello.c
代码如下: #include&stdio.h&
#include &sf_gg_Hello.h&
JNIEXPORT jint JNICALL Java_sf_gg_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){
return x+y;
//简单的加法
编译运行 OS: ubuntu 14.04 lts
gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-8-oracle/include -I/usr/lib/jvm/java-8-oracle/include/linux -c hello.c
命令解释: man gcc 注意:需要命令中的 /usr/lib/jvm/java-8-oracle/include 需要换成本机的 jdk 对应的目录
生成 so 库 gcc hello.o -o main.so -shared
查看生成的文件
运行 java sf.gg.Hello
总结 最近工作中遇到了调用其他部门提供的加密的 dll 和 so 。 反向开发: 如果提供了 so 文件,而我们必须通过编写 java 代码调用,则我们需要知道 java 中的 package 的路径,java 中方法的声明
用微信扫描二维码分享至好友和朋友圈
目前没有跟贴,欢迎你发表观点
图片,文字等缺失或错误
色情,暴力等非法内容
广告,重复文章等垃圾内容
我有话要说安卓JNI 调用第三方库的时候 不能加载so文件_问答_ThinkSAAS
安卓JNI 调用第三方库的时候 不能加载so文件
安卓JNI 调用第三方库的时候 不能加载so文件
so文件已经编译完成,好像就是不能调用,然后再app上也是闪退。
08-20 10:50:26.094 /com.jour.st.use_dsf E/AndroidRuntime﹕
FATAL EXCEPTION: main
Process: com.jour.st.use_dsf, PID: 32261
java.lang.UnsatisfiedLinkError: Couldn't load test from loader
dalvik.system.PathClassLoader[DexPathList[[zip file
"/data/app/com.jour.st.use_dsf-2.apk"],nativeLibraryDirectories=
findLibrary returned null
解决了,MD,困扰了一天一夜!!还有几个问题可以帮忙解决吗
我把so文件放在src/main/jinLibs 里面了,找了好多网页,尽然可以用!!!
还有就是那么libs文件,我都搞混了,
红色是自己生成的,蓝色是ndk-build生成的,黄色是最后加的,到底什么和什么关系啊
从错误信息看,是.so文件找不到,load失败,还没到jni调用那一步。所以,确保你的.so文件已经放在libs目录下,并编译进了apk。你可以用压缩软件打开apk文件,看看里面是不是已经包含了.so文件。
添加你想要问的问题
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
关注微信,更好学习

我要回帖

更多关于 java jni so 的文章

 

随机推荐