Android-windows下的jni实践之路

编译过程:

D:\programming>cd D:\programming\java\YourSafe\bin\classes\com\example\yoursafe


D:\programming\java\YourSafe\bin\classes\com\example\yoursafe>javah -jni MainAct
ivity
错误: 找不到 'MainActivity' 的类文件。


D:\programming\java\YourSafe\bin\classes\com\example\yoursafe>cd ../../..


D:\programming\java\YourSafe\bin\classes>javah -jni com.example.yoursafe.MainAct
ivity
无法找到类型 'android.annotation.SuppressLint' 的注释方法 'value()': 找不到andro
id.annotation.SuppressLint的类文件
错误: 无法访问android.app.Activity
  找不到android.app.Activity的类文件


D:\programming\java\YourSafe\bin\classes>javah -jni com.example.yoursafe.Hello


D:\programming\java\YourSafe\bin\classes>cd D:\programming\java\YourSafe\jni


D:\programming\java\YourSafe\jni>d:


D:\programming\java\YourSafe\jni>ndk-build
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
F:\360Apps\Android\android-ndk-r10\build/core/build-local.mk:148: *** Android ND
K: Aborting    .  Stop.


D:\programming\java\YourSafe\jni>ndk-build android.mk
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
F:\360Apps\Android\android-ndk-r10\build/core/build-local.mk:148: *** Android ND
K: Aborting    .  Stop.


D:\programming\java\YourSafe\jni>set NDK_PROJECT_PATH = D:\programming\java\Your
Safe


D:\programming\java\YourSafe\jni>ndk-build android.mk
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
F:\360Apps\Android\android-ndk-r10\build/core/build-local.mk:148: *** Android ND
K: Aborting    .  Stop.


D:\programming\java\YourSafe\jni>echo %D:\programming\java\YourSafe%
%D:\programming\java\YourSafe%


D:\programming\java\YourSafe\jni>echo % NDK_PROJECT_PATH%
% NDK_PROJECT_PATH%


D:\programming\java\YourSafe\jni>echo %NDK_PROJECT_PATH%
%NDK_PROJECT_PATH%


D:\programming\java\YourSafe\jni>set NDK_PROJECT_PATH=D:\programming\java\YourSa
fe


D:\programming\java\YourSafe\jni>echo %NDK_PROJECT_PATH%
D:\programming\java\YourSafe


D:\programming\java\YourSafe\jni>ndk-build
Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersi
on 8 in D:\programming\java\YourSafe/AndroidManifest.xml
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: D:\programming\jav
a\YourSafe/jni/Android.mk
F:/360Apps/Android/android-ndk-r10/build/core/add-application.mk:209: *** Androi
d NDK: Aborting...    .  Stop.


D:\programming\java\YourSafe\jni>cd ..


D:\programming\java\YourSafe>cd..


D:\programming\java>cd yoursafe


D:\programming\java\YourSafe>ndk-build
Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersi
on 8 in D:\programming\java\YourSafe/AndroidManifest.xml
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: D:\programming\jav
a\YourSafe/jni/Android.mk
F:/360Apps/Android/android-ndk-r10/build/core/add-application.mk:209: *** Androi
d NDK: Aborting...    .  Stop.


D:\programming\java\YourSafe>ndk-build
Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersi
on 8 in D:\programming\java\YourSafe/AndroidManifest.xml
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: D:\programming\jav
a\YourSafe/jni/Android.mk
F:/360Apps/Android/android-ndk-r10/build/core/add-application.mk:209: *** Androi
d NDK: Aborting...    .  Stop.


D:\programming\java\YourSafe>ndk-build
Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersi
on 8 in D:\programming\java\YourSafe/AndroidManifest.xml
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: D:\programming\jav
a\YourSafe/jni/Android.mk
F:/360Apps/Android/android-ndk-r10/build/core/add-application.mk:209: *** Androi
d NDK: Aborting...    .  Stop.


D:\programming\java\YourSafe>ndk-build
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: D:\programming\jav
a\YourSafe/jni/Android.mk
F:/360Apps/Android/android-ndk-r10/build/core/add-application.mk:209: *** Androi
d NDK: Aborting...    .  Stop.


D:\programming\java\YourSafe>ndk-build
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: D:\programming\jav
a\YourSafe/jni/Android.mk
F:/360Apps/Android/android-ndk-r10/build/core/add-application.mk:209: *** Androi
d NDK: Aborting...    .  Stop.


D:\programming\java\YourSafe>ndk-build
[armeabi] Compile++ thumb: hello <= hello.cpp
D:\programming\java\YourSafe/jni/hello.cpp: In function '_jstring* Java_com_exam
ple_yoursafe_Hello_hello(JNIEnv*, jclass)':
D:\programming\java\YourSafe/jni/hello.cpp:6:9: error: 'env' was not declared in
 this scope
make.exe: *** [D:\programming\java\YourSafe/obj/local/armeabi/objs/hello/hello.o
] Error 1


D:\programming\java\YourSafe>ndk-build
[armeabi] Compile++ thumb: hello <= hello.cpp
[armeabi] StaticLibrary  : libstdc++.a
[armeabi] SharedLibrary  : libhello.so
[armeabi] Install        : libhello.so => libs/armeabi/libhello.so


编译前配置的mk文件:Android.mk(android的a要大写)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.cpp
include $(BUILD_SHARED_LIBRARY)


编译过程:


编译class文件得到jni文件。


把编译好jni的c的头文件放在项目根目录jni文件夹下,没有jni文件夹就自己创建一个。


接下来,编译得到so文件,在项目根路径下编译啊(也许还要设置NDK_PROJECT_PATH环境变量指向你的项目根路径!)


必须在项目的根路径编译:parentPath\ndk-build(ndk-build为ndk下文件配置到环境变量path中可随处使用)

eg.D:\androidProject\ndk-build

接下来就是自动编译了,是在windows下编译

--遇到问题上面已经显示了:

解决问题1:版本问题:本jni编译器只支持android-15以上,所以设置AndroidManifest.xml文件中的

<uses-sdk
        android:minSdkVersion="15"  android:targetSdkVersion="21" />
//设置minSdkVersion到合适版本

--遇到问题2:APP_BUILD_SCRIPT points to an unknown file就是Android.xml文件名a要大写。


--遇到问题3:代码错误,漏写变量啊,错误函数啊,这个编译器应该会指出,照提示修改。



编译后会有obj文件夹,运行程序会自动将so文件加载到libs文件下。


编译后obj文件路径:

obj/local/armeabi/objs

--hello

--hello.o

--hello.o.d

--libhello.so

--libstdc++.a

编译后的so文件路径:

libs/armeabi/libhello.so


最后在手机运行成功调用jni函数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值