android jni开发(android studio JNI开发时 编译成功 但是没有生成.so文件 什么原因)

本文目录
- android studio JNI开发时 编译成功 但是没有生成.so文件 什么原因
- 在android开发jni,为什么jni.h导不进来
- 如何定位Android NDK开发中遇到的错误
- android 为什么要使用jni
- android jni开发需要懂c语言吗
- JNI是什么 android开发中必须要用到吗
- android使用jni开发,能不能使用信号的
- android studio 怎样进行jni开发
android studio JNI开发时 编译成功 但是没有生成.so文件 什么原因
1
在交叉编译的时候怎么都无法生成so文件,javah生成头文件没错,c文件也没错,java文件也没错,
2.原因:是JNI文件夹路径不对
3
在执行javah命令时,我进入的是cd
app/src/main/java
这样jni文件夹在java文件夹下,作为一个包存在,这样就无法生成so文件
执行javah的正确姿势:
4
进入app/src/main目录:cd
app/src/main
执行javah命令:javah
javah
-d
jni
-classpath
./Java
lab.sodino.jnitest.MainActivity
5,
-d
jni
头文件生成到jni文件夹(当前在《Project》\app\src\main目录下,所以.h所在的目录为《Project》\app\src\main\jni
)
-classpath
./java
指定去当前路径下java下寻找包名指定的类
这样再rebuild一下,就会生成so文件了
在android开发jni,为什么jni.h导不进来
这个是个库,需要你有NDK或者源码编译环境,单纯的eclipse是不行的。。。会提示错误。
如果想编译成功,你可以参考如下Android.mk,关键是
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE)
////////////////////////////////////////////////////////////////
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= liblocalmeida
LOCAL_SRC_FILES:= \
libmedia_jni.cpp
LOCAL_SHARED_LIBRARIES := \
liblog \
libutils \
libandroid_runtime
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE)
LOCAL_PROGUARD_ENABLED:= disabled
include $(BUILD_SHARED_LIBRARY)
如何定位Android NDK开发中遇到的错误
NDK错误发生时,能拿到什么信息
利用Android
NDK开发本地应用的时候,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。单靠添加一行行的打印信息来定位错误代码做在的行数,无疑是一件令人崩溃的事情。在网上搜索“Android
NDK崩溃”,可以搜索到很多文章来介绍如何通过Android提供的工具来查找和定位NDK的错误,但大都晦涩难懂。下面以一个实际的例子来说明,首先生成一个错误,然后演示如何通过两种不同的方法,来定位错误的函数名和代码行。
首先,看在hello-jni程序的代码中做了什么(有关如何创建或导入工程,此处略):在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中, std::string的这种赋值方法会产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。我们记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃。
下面来看看发生崩溃(闪退)时系统打印的logcat日志:
[plain] view
plain copy
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: ’vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys’
pid: 32607, tid: 32607, name: xample.hellojni 》》》 com.example.hellojni 《《《
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
r0 00000000 r1 beb123a8 r2 80808080 r3 00000000
r4 5d635f68 r5 5cdc3198 r6 41efcb18 r7 5d62df44
r8 4121b0c0 r9 00000001 sl 00000000 fp beb1238c
ip 5d635f7c sp beb12380 lr 5d62ddec pc 400e7438 cpsr 60000010
backtrace:
#00 pc 00023438 /system/lib/libc.so
#01 pc 00004de8 /data/app-lib/com.example.hellojni-2/libhello-jni.so
#02 pc 000056c8 /data/app-lib/com.example.hellojni-2/libhello-jni.so
#03 pc 00004fb4 /data/app-lib/com.example.hellojni-2/libhello-jni.so
#04 pc 00004f58 /data/app-lib/com.example.hellojni-2/libhello-jni.so
#05 pc 000505b9 /system/lib/libdvm.so
#06 pc 00068005 /system/lib/libdvm.so
#07 pc 000278a0 /system/lib/libdvm.so
#08 pc 0002b7fc /system/lib/libdvm.so
#09 pc 00060fe1 /system/lib/libdvm.so
#10 pc 0006100b /system/lib/libdvm.so
#11 pc 0006c6eb /system/lib/libdvm.so
#12 pc 00067a1f /system/lib/libdvm.so
#13 pc 000278a0 /system/lib/libdvm.so
#14 pc 0002b7fc /system/lib/libdvm.so
#15 pc 00061307 /system/lib/libdvm.so
#16 pc 0006912d /system/lib/libdvm.so
#17 pc 000278a0 /system/lib/libdvm.so
#18 pc 0002b7fc /system/lib/libdvm.so
#19 pc 00060fe1 /system/lib/libdvm.so
#20 pc 00049ff9 /system/lib/libdvm.so
#21 pc 0004d419 /system/lib/libandroid_runtime.so
#22 pc 0004e1bd /system/lib/libandroid_runtime.so
#23 pc 00001d37 /system/bin/app_process
#24 pc 0001bd98 /system/lib/libc.so
#25 pc 00001904 /system/bin/app_process
stack:
beb12340 012153f8
beb12344 00054290
beb12348 00000035
beb1234c beb123c0 [stack]
……
如果看过logcat打印的NDK错误时的日志就会知道,这里省略了后面很多的内容,很多人看到这么多密密麻麻的日志就已经头晕脑胀了,即使是很多资深的Android开发者,在面对NDK日志时也大都默默的选择了无视
android 为什么要使用jni
android的jni可以使用c/c++来开发,相比java而言,运行的效率提高了很多,特别是在做一些图像算法,或者游戏逻辑的时候,使用jni将大大的提高效率。比如某个游戏要采用opengl,同样加载一个由1000个多边形组成的3d模型,jni要比java运算快好几倍,这样就保证了游戏运行的fps不会太低。
另外一个好处就是内存管理上面,java的内存管理全部由虚拟机来管理,C++由程序员来管理,利用率上面就好多了。
等等其他优点。
既然这么多的优点,为什么一个android程序不采用纯c来开发呢?因为是android的 UI framework采用java,所以,在UI上面还是采用java来开发。
android jni开发需要懂c语言吗
1.先来一个用C写的例子:
(1)hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)-》调用方法且方法中要传入env.
1 #include 《jni.h》
2
3 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
4 return (*env)-》NewStringUTF(env,“Hello Jni----》C!“);
5 }
(2)Android.mk文件,更改后缀名为.c
复制代码
1 LOCAL_PATH := $(call my-dir)
2
3 include $(CLEAR_VARS)
4
5 LOCAL_MODULE := hello
6 LOCAL_SRC_FILES := hello.c
7
8 include $(BUILD_SHARED_LIBRARY)
复制代码
JNI是什么 android开发中必须要用到吗
Android开发不难找工作,看能力,jni的学习需要知道c++或者c方面的知识,jni刚刚开始还是很难的,特别是javaVM和JNIEnv方面的知识得好好了解,还有有一些比较麻烦的就是java和c++有数据交互的情况下也麻烦一些,要建立相应的数据结构并且需要转换,一般需要用到jni都是一些简单的,比如java调c++或者c++调java之类的,涉及到多线程就麻烦些,得到了刚刚说的javavm以及jnienv
android使用jni开发,能不能使用信号的
可以。实现JNI原生函数源文件:
新建com_lucyfyr_HelloWorld.c文件:
#include 《jni.h》
#define LOG_TAG “HelloWorld“
#include 《utils/Log.h》
/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
LOGI(“dufresne Hello World From libhelloworld.so!“);
// 从 instring 字符串取得指向字符串 UTF 编码的指针
const char *str =
(const char *)(*env)-》GetStringUTFChars( env,inputStr, JNI_FALSE );
LOGI(“dufresne---》%s“,(const char *)str);
// 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
(*env)-》ReleaseStringUTFChars(env, inputStr, (const char *)str );
return (*env)-》NewStringUTF(env, “Hello World! I am Native interface“);
}
/* This function will be call when the library first be load.
* You can do some init in the libray. return which version jni it support.
*/
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
LOGI(“dufresne-----》JNI_OnLoad!“);
if ((*vm)-》GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
LOGE(“dufresne---》ERROR: GetEnv failed“);
return -1;
} return JNI_VERSION_1_4;
}
OnLoadJava_com_lucyfyr_HelloWorld_printJNI
函数里面做一些log输出 注意JNI中的log输出的不同。
JNI_OnLoad函数JNI规范定义的,当共享库第一次被加载的时候会被回调,
这个函数里面可以进行一些初始化工作,比如注册函数映射表,缓存一些变量等,
最后返回当前环境所支持的JNI环境。本例只是简单的返回当前JNI环境。
android studio 怎样进行jni开发
方法如下:
1.添加如下代码在MainActivity类内
static {
System.loadLibrary(“hello_jni“);
}
public native String getstringfromC();
2.打开终端,android studio已经提供了终端
3.首先进入java目录执行命令:
javah -d ../jni com.example.root.ndk_sample.MainActivity
com.example.root.ndk_sample.MainActivity是native函数的所在的包名和类名,中间使用“.”号分开
4.添加*.c文件在jni目录中
5.编写Android.mk和Application.mk 放在jni目录下面
6.Android.mk文件的内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello_jni
LOCAL_SRC_FILES := hello_jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk 文件内容为:
APP_ABI := all
APP_OPIM :=debug

更多文章:
turtles歌曲(哪位大神有turtles(乌龟组合)的<谢谢>的歌词中文翻译 感激不尽)
2026年10月11日 10:00
金山铁路22号线(请问现在轨道交通22号线金山铁路是个什么情况据说9月28日就开通了啊~~~)
2026年10月11日 09:10
repercussions(都是余波,repercussions和aftermath有什么区别啊)
2026年10月11日 09:00
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026年10月11日 08:50
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40




